СортировкиMergeSortQuickSortДерево решенийАлгоритмы
3 мин чтение
Алгоритмы сортировки и теоретическая граница
Исчерпывающий разбор алгоритмов сортировки: Bubble Sort, Insertion Sort, Merge Sort, Quick Sort, Heap Sort. Математический вывод нижней границы сложности сортировок сравнением через дерево решений высоты h >= log2(N!).
Исходная заготовка: полнота объяснения и примеров ожидает редакторской проверки.
Введение в задачу сортировки
Задача сортировки: Для входной последовательности найти перестановку , такую что .
Теоретическая нижняя граница сложности: Дерево решений
Любая сортировка, использующая только попарные сравнения элементов (), может быть представлена в виде бинарного дерева решений (Decision Tree):
Математический вывод:
Теорема: Любой алгоритм сортировки, основанный на сравнениях, в худшем случае требует операций.
Сравнительная таблица алгоритмов сортировки
| Алгоритм | Лучшее время | Среднее время | Худшее время | Память | Стабильность | Метод |
|---|---|---|---|---|---|---|
| **Bubble Sort** | 17 (с флагом) | 18 | 19 | 20 | Да | Обмен |
| **Insertion Sort** | 21 | 22 | 23 | 24 | Да | Вставки |
| **Merge Sort** | 25 | 26 | 27 | 28 | Да | Разделяй и властвуй |
| **Quick Sort** | 29 | 30 | 31 | 32 | Нет | Разделяй и властвуй |
| **Heap Sort** | 33 | 34 | 35 | 36 | Нет | Пирамида |
cpp
// Реализация MergeSort
void merge(vector<int>& arr, int l, int m, int r) {
vector<int> left(arr.begin() + l, arr.begin() + m + 1);
vector<int> right(arr.begin() + m + 1, arr.begin() + r + 1);
int i = 0, j = 0, k = l;
while (i < left.size() && j < right.size()) {
if (left[i] <= right[j]) arr[k++] = left[i++];
else arr[k++] = right[j++];
}
while (i < left.size()) arr[k++] = left[i++];
while (j < right.size()) arr[k++] = right[j++];
}
void mergeSort(vector<int>& arr, int l, int r) {
if (l >= r) return;
int m = l + (r - l) / 2;
mergeSort(arr, l, m);
mergeSort(arr, m + 1, r);
merge(arr, l, m, r);
}
Что дальше?
Закрепите материал задачей: Повторить число.
Изучено — к практике →Отметка сохранится в этом браузере. Её можно отменить или снять кнопкой «Изучено».