Общие сортировки:
Частные случаи:
| Сортировка | Худший случай | Средний случай | Лучший случай | Доп память |
|---|---|---|---|---|
| Сортировка выбором | О(n2) | О(n2) | О(n2) | Нет |
| Сортировка вставкой | О(n2) | О(n) | О(n2) | Нет |
| Сортировка слиянием | О(nlog(n)) | О(nlog(n)) | О(nlog(n)) | Да |
| Быстрая сортировка | О(n2) | О(nlog(n)) | О(nlog(n)) | Нет |
- Организуем цикл по массиву
range(n) - На каждой итерации находим индекс самого маленького элемента в срезе от [i:n]
- Меняем элемент i с найденным местами
| Сортировка | Худший случай | Средний случай | Лучший случай | Доп память |
|---|---|---|---|---|
| Сортировка выбором | О(n2) | О(n2) | О(n2) | Нет |
-
Организуем цикл по массиву
range(1,n) -
На каждой итерации идем в обратном порядке к началу массива и ищем элемент который меньше чем
a[i]и меняем значениеa[j+1]=a[j], чтобы сделать смещение элементов при вставке нового. -
Когда нашелся такой элемент или мы дошли до конца массива делаем
a[j+1] = a[i]
| Сортировка | Худший случай | Средний случай | Лучший случай | Доп память |
|---|---|---|---|---|
| Сортировка вставкой | О(n2) | О(n) | О(n2) | Нет |
Суть алгоритма заключается в реализации двух функций:
merge_sort(a,p,r) и merge(a,p,q,r), где p- левая граница сортируемого массива
q - середина сортируемого отрезка, а r- правая граница. Все границы включительно.
Алгоритм merge_sort:
0) Пишем условие выхода if p >= r: return (Если левая граница >= правой то длина массива меньше 1)
- Находим середину сортируемого отрезка
q=(p+r) // 2 - Вызываем функции
merge_sort(a,p,q)иmerge_sort(a, q+1,r) - Вызываем функцию
merge(a,p,q,r) - Возвращаем отсортированный массив
Алгоритм merge:
-
Создаем два массива
b = a[p:q+1]иc = a[q+1:r+1]- левая и правая часть отрезков -
Закидываем им в конец бесконечности (нужно для удобства реализации)
b.append(float('inf'))иc.append(float('inf')) -
Заводим два индекса
iиj. Они будут служить указателями на позиции в наших массивах. А далее итерируемся по массивуa(range(p, r+1)) и сравниваем элементыb[i]иc[j]. Еслиb[i]>c[j]тогда кa[k]присваиваемb[i]и увеличиваем i на единицу. Аналогично дляc[j]иjв иной ситуации.
| Сортировка | Худший случай | Средний случай | Лучший случай | Доп память |
|---|---|---|---|---|
| Сортировка слиянием | О(nlog(n)) | О(nlog(n)) | О(nlog(n)) | Да |
Алгоритм заключается в реализации двух функций: quick_sort(a,p,r) и partition(a,p,r), где a - сортируемый список
p - левая граница, r - правая граница.
Алгоритм quick_sort(a,p,r)
-
Находим опорный элемент при помощи функции
partition. Этот элемент обладает некоторыми свойствами:- Он считается полностью отсортированным, то есть уже стоит на верной позиции
- Элементы справа от него больше, элементы слева - меньше. То есть при нахождении опорного элемента удается разбить массив на 2 части.
-
Рекурсивно вызываем функции сортировки левого
quick_sort(a,p,q-1)и правогоquick_sort(a,q+1,r)отрезков. -
Возвращаем отсортированный массив
Алгоритм partition(a,p,r):
-
Приравниваем
q=p. -
Итерируемся от начала до конца отрезка и ищем элементы которые меньше опорного и закидываем их в левую часть массива.
-
После завершения цикла меняем опорный элемент с элементом, стоящим после младших
| Сортировка | Худший случай | Средний случай | Лучший случай | Доп память |
|---|---|---|---|---|
| Быстрая сортировка | О(n2) | О(nlog(n)) | О(nlog(n)) | Нет |
Алгоритм сортировки подсчетом сводится к реализации трех функций:
count_keys_equal(a, n, m)- функция для подсчета количества различных цифр в списке.count_less_keys(equal, m)- функция для расчета промежуточной суммы, где каждый элементless[j]является суммой предыдущих элементов.rearrange(a, less, n)- функция пересоздания массива с уже отсортированными значениями.