VIP Алгоритмы сортировки в C++

Активный
Статус
Сообщения
516
Лайки
32

8

месяц на сайте

Руководство по реализации основных алгоритмов сортировки с примерами кода.

Пузырьковая сортировка

Код:
#include <iostream>
#include <vector>

void bubbleSort(std::vector<int>& arr) {
    int n = arr.size();
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                std::swap(arr[j], arr[j + 1]);
            }
        }
    }
}

int main() {
    std::vector<int> arr = {64, 34, 25, 12, 22, 11, 90};
    bubbleSort(arr);
    
    for (int num : arr) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
    
    return 0;
}

Сортировка выбором

Код:
#include <iostream>
#include <vector>

void selectionSort(std::vector<int>& arr) {
    int n = arr.size();
    for (int i = 0; i < n - 1; i++) {
        int minIndex = i;
        for (int j = i + 1; j < n; j++) {
            if (arr[j] < arr[minIndex]) {
                minIndex = j;
            }
        }
        std::swap(arr[i], arr[minIndex]);
    }
}

int main() {
    std::vector<int> arr = {64, 34, 25, 12, 22, 11, 90};
    selectionSort(arr);
    
    for (int num : arr) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
    
    return 0;
}

Сортировка вставками

Код:
#include <iostream>
#include <vector>

void insertionSort(std::vector<int>& arr) {
    int n = arr.size();
    for (int i = 1; i < n; i++) {
        int key = arr[i];
        int j = i - 1;
        
        while (j >= 0 && arr[j] > key) {
            arr[j + 1] = arr[j];
            j--;
        }
        arr[j + 1] = key;
    }
}

int main() {
    std::vector<int> arr = {64, 34, 25, 12, 22, 11, 90};
    insertionSort(arr);
    
    for (int num : arr) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
    
    return 0;
}

Быстрая сортировка

Код:
#include <iostream>
#include <vector>

int partition(std::vector<int>& arr, int low, int high) {
    int pivot = arr[high];
    int i = low - 1;
    
    for (int j = low; j < high; j++) {
        if (arr[j] < pivot) {
            i++;
            std::swap(arr[i], arr[j]);
        }
    }
    std::swap(arr[i + 1], arr[high]);
    return i + 1;
}

void quickSort(std::vector<int>& arr, int low, int high) {
    if (low < high) {
        int pi = partition(arr, low, high);
        quickSort(arr, low, pi - 1);
        quickSort(arr, pi + 1, high);
    }
}

int main() {
    std::vector<int> arr = {64, 34, 25, 12, 22, 11, 90};
    quickSort(arr, 0, arr.size() - 1);
    
    for (int num : arr) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
    
    return 0;
}

Сортировка слиянием

Код:
#include <iostream>
#include <vector>

void merge(std::vector<int>& arr, int left, int mid, int right) {
    int n1 = mid - left + 1;
    int n2 = right - mid;
    
    std::vector<int> leftArr(n1);
    std::vector<int> rightArr(n2);
    
    for (int i = 0; i < n1; i++) {
        leftArr[i] = arr[left + i];
    }
    for (int j = 0; j < n2; j++) {
        rightArr[j] = arr[mid + 1 + j];
    }
    
    int i = 0, j = 0, k = left;
    
    while (i < n1 && j < n2) {
        if (leftArr[i] <= rightArr[j]) {
            arr[k] = leftArr[i];
            i++;
        } else {
            arr[k] = rightArr[j];
            j++;
        }
        k++;
    }
    
    while (i < n1) {
        arr[k] = leftArr[i];
        i++;
        k++;
    }
    
    while (j < n2) {
        arr[k] = rightArr[j];
        j++;
        k++;
    }
}

void mergeSort(std::vector<int>& arr, int left, int right) {
    if (left < right) {
        int mid = left + (right - left) / 2;
        mergeSort(arr, left, mid);
        mergeSort(arr, mid + 1, right);
        merge(arr, left, mid, right);
    }
}

int main() {
    std::vector<int> arr = {64, 34, 25, 12, 22, 11, 90};
    mergeSort(arr, 0, arr.size() - 1);
    
    for (int num : arr) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
    
    return 0;
}

Пирамидальная сортировка (Heap Sort)

Код:
#include <iostream>
#include <vector>

void heapify(std::vector<int>& arr, int n, int i) {
    int largest = i;
    int left = 2 * i + 1;
    int right = 2 * i + 2;
    
    if (left < n && arr[left] > arr[largest]) {
        largest = left;
    }
    
    if (right < n && arr[right] > arr[largest]) {
        largest = right;
    }
    
    if (largest != i) {
        std::swap(arr[i], arr[largest]);
        heapify(arr, n, largest);
    }
}

void heapSort(std::vector<int>& arr) {
    int n = arr.size();
    
    // Построение кучи
    for (int i = n / 2 - 1; i >= 0; i--) {
        heapify(arr, n, i);
    }
    
    // Извлечение элементов из кучи
    for (int i = n - 1; i > 0; i--) {
        std::swap(arr[0], arr[i]);
        heapify(arr, i, 0);
    }
}

int main() {
    std::vector<int> arr = {64, 34, 25, 12, 22, 11, 90};
    heapSort(arr);
    
    for (int num : arr) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
    
    return 0;
}

Сортировка подсчетом

Код:
#include <iostream>
#include <vector>
#include <algorithm>

void countingSort(std::vector<int>& arr) {
    int max = *std::max_element(arr.begin(), arr.end());
    int min = *std::min_element(arr.begin(), arr.end());
    int range = max - min + 1;
    
    std::vector<int> count(range);
    std::vector<int> output(arr.size());
    
    // Подсчет элементов
    for (int num : arr) {
        count[num - min]++;
    }
    
    // Изменение count для позиций
    for (int i = 1; i < range; i++) {
        count[i] += count[i - 1];
    }
    
    // Построение выходного массива
    for (int i = arr.size() - 1; i >= 0; i--) {
        output[count[arr[i] - min] - 1] = arr[i];
        count[arr[i] - min]--;
    }
    
    arr = output;
}

int main() {
    std::vector<int> arr = {64, 34, 25, 12, 22, 11, 90};
    countingSort(arr);
    
    for (int num : arr) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
    
    return 0;
}

Сравнение производительности

Код:
#include <iostream>
#include <vector>
#include <chrono>
#include <algorithm>
#include <random>

void measureSortTime(void (*sortFunc)(std::vector<int>&), std::vector<int> arr, const std::string& name) {
    auto start = std::chrono::high_resolution_clock::now();
    sortFunc(arr);
    auto end = std::chrono::high_resolution_clock::now();
    
    auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start);
    std::cout << name << ": " << duration.count() << " микросекунд" << std::endl;
}

int main() {
    const int size = 1000;
    std::vector<int> arr(size);
    
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_int_distribution<> dis(1, 1000);
    
    for (int i = 0; i < size; i++) {
        arr[i] = dis(gen);
    }
    
    std::vector<int> arr1 = arr;
    std::vector<int> arr2 = arr;
    std::vector<int> arr3 = arr;
    
    measureSortTime(bubbleSort, arr1, "Bubble Sort");
    measureSortTime(quickSort, arr2, "Quick Sort");
    measureSortTime(mergeSort, arr3, "Merge Sort");
    
    return 0;
}

Сортировка объектов

Код:
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>

struct Person {
    std::string name;
    int age;
    
    Person(const std::string& n, int a) : name(n), age(a) {}
};

bool compareByAge(const Person& a, const Person& b) {
    return a.age < b.age;
}

bool compareByName(const Person& a, const Person& b) {
    return a.name < b.name;
}

int main() {
    std::vector<Person> people = {
        Person("Иван", 25),
        Person("Петр", 30),
        Person("Мария", 28)
    };
    
    // Сортировка по возрасту
    std::sort(people.begin(), people.end(), compareByAge);
    
    for (const auto& person : people) {
        std::cout << person.name << " - " << person.age << std::endl;
    }
    
    // Сортировка по имени
    std::sort(people.begin(), people.end(), compareByName);
    
    for (const auto& person : people) {
        std::cout << person.name << " - " << person.age << std::endl;
    }
    
    return 0;
}

Использование std::sort

Код:
#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> arr = {64, 34, 25, 12, 22, 11, 90};
    
    // Сортировка по возрастанию
    std::sort(arr.begin(), arr.end());
    
    for (int num : arr) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
    
    // Сортировка по убыванию
    std::sort(arr.begin(), arr.end(), std::greater<int>());
    
    for (int num : arr) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
    
    return 0;
}

Алгоритмы сортировки - фундаментальная тема в программировании. Понимание различных методов сортировки помогает выбрать оптимальный алгоритм для конкретной задачи.
 

1 человек читают эту тему (Всего: 1, Пользователей: 0, Гостей: 1)

Сверху