Алгоритмы сортировки — это методы упорядочивания элементов в определённой последовательности (обычно по возрастанию или убыванию). Рассмотрим основные виды алгоритмов сортировки, их характеристики и примеры реализации.
Сортировка пузырьком (Bubble Sort)
void bubbleSort(int arr[], int n) {
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]);
}
}
}
}
Особенности:
Сортировка вставками (Insertion Sort)
void insertionSort(int arr[], int n) {
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;
}
}
Применение:
Быстрая сортировка (Quick Sort)
int partition(int arr[], int low, int high) {
int pivot = arr[high];
int i = low - 1;
for (int j = low; j <= high-1; j++) {
if (arr[j] < pivot) {
i++;
std::swap(arr[i], arr[j]);
}
}
std::swap(arr[i+1], arr[high]);
return i+1;
}
void quickSort(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);
}
}
Особенности:
Сортировка слиянием (Merge Sort)
void merge(int arr[], int l, int m, int r) {
// Реализация слияния двух подмассивов
}
void mergeSort(int arr[], int l, int r) {
if (l < r) {
int m = l + (r - l)/2;
mergeSort(arr, l, m);
mergeSort(arr, m+1, r);
merge(arr, l, m, r);
}
}
Преимущества:
Сортировка подсчётом (Counting Sort)
void countingSort(int arr[], int n, int range) {
std::vector<int> count(range+1, 0);
std::vector<int> output(n);
for (int i = 0; i < n; i++)
count[arr[i]]++;
for (int i = 1; i <= range; i++)
count[i] += count[i-1];
for (int i = n-1; i >= 0; i--) {
output[count[arr[i]]-1] = arr[i];
count[arr[i]]--;
}
for (int i = 0; i < n; i++)
arr[i] = output[i];
}
Условия применения:
Поразрядная сортировка (Radix Sort) Принцип работы:
| Алгоритм | Лучший | Средний | Худший | Память | Устойчивость |
|---|---|---|---|---|---|
| Пузырьковая | O(n) | O(n²) | O(n²) | O(1) | Да |
| Вставками | O(n) | O(n²) | O(n²) | O(1) | Да |
| Быстрая | O(n log n) | O(n log n) | O(n²) | O(log n) | Нет* |
| Слиянием | O(n log n) | O(n log n) | O(n log n) | O(n) | Да |
| Подсчётом | O(n + k) | O(n + k) | O(n + k) | O(n + k) | Да |
std::sort (обычно гибрид QuickSort + HeapSort)
#include <algorithm>
std::vector<int> vec = {4, 2, 5, 1, 3};
std::sort(vec.begin(), vec.end());
std::stable_sort (устойчивая сортировка)
struct Item { int value; int index; };
bool compareByValue(const Item& a, const Item& b) {
return a.value < b.value;
}
std::stable_sort(items.begin(), items.end(), compareByValue);
Резюмируем: выбор алгоритма сортировки зависит от размера данных, особенностей входных данных и требований к стабильности и памяти. В большинстве случаев в C++ следует использовать std::sort, но понимание работы различных алгоритмов важно для специализированных задач.