Сортирорвки¶
Ссылки:
Устойчивая (стабильная) сортировка — сортировка, которая не меняет относительный порядок сортируемых элементов, имеющих одинаковые ключи, по которым происходит сортировка.
QuickSort¶
Находится опорная точка (первая / последняя / середина) по значению
Относительно нее на текущем обрабатываемом участке массива происходит перестановка для всех элементов (>=) нее - вправо, и соответственно влево для (<=). При этом находится середина, относительно которой справа будут большие (или равные) элементы чем опорная точка, а слева меньшие (или равные).
Сортировка повторяется для двух участков, разделенных найденной серединой
algorithm quicksort(A, lo, hi) is
if lo < hi then
p := partition(A, lo, hi)
quicksort(A, lo, p)
quicksort(A, p + 1, hi)
algorithm partition(A, lo, hi) is
pivot := A[lo + (hi - lo) / 2]
i := lo - 1
j := hi + 1
loop forever
do i := i + 1 while A[i] < pivot
do j := j - 1 while A[j] > pivot
if i >= j then return j
swap A[i] with A[j]
// Находится опорная точка
pivot := A.pop()
// Создается массив с меньшими элементами чем опорная точка от исходного
lA := A.filter(where e < pivot)
// Создается массив с большими элементами чем опорная точка от исходного
rA := A.filter(where e >= pivot)
// вернуть массив состоящий из отсортированной левой части, опорного и отсортированной правой части
return quicksort(lA) + [pivot] + quicksort(rA)
Ссылки:
Пирамидальная сортировка (HeapSort)¶
Строится пирамида (двоичная куча), последовательно удаляются узлы, начиная с вершины. гарантированная сложность Θ(n log n)
MergeSort¶
Сортируемый массив разбивается на две части примерно одинакового размера.
Каждая из получившихся частей сортируется отдельно, например — тем же самым алгоритмом.
Два упорядоченных массива половинного размера соединяются в один.
Ссылки:
TimSort¶
Гибридный алгоритм сортировки, сочетающий сортировку вставками и сортировку слиянием (MergeSort)
По специальному алгоритму входной массив разделяется на подмассивы.
Каждый подмассив сортируется сортировкой вставками.
Отсортированные подмассивы собираются в единый массив с помощью модифицированной сортировки слиянием.
RadixSort¶
Исходный массив: a.
Максимальное число разрядов: k.
Число различных цифр в пределах одного разряда d
Создается дополнительная структура (Массив массивов)
bдля каждой цифры (размерностьюd).Для каждого разряда (
k_cur:k), начиная с наименьшего:2.1. Занести все число
a[i]в массивbпод индексомa[i].get(k_cur)(число в текущем разрядеk_cur):b.add( a[i].get(k_cur) ) = a[i]
2.2. После прохода по всему массиву
a, выполняется проход по сформировавшемуся массивуb, начиная от наименьшего числа, выписывая все элементы в массивaначиная с первого записанногоПосле всех проходов, полученный результат сортировки будет храниться в массиве
a
[40, 34, 32, 2, 14, 24] k = 2 d = 5 (0, 1, 2, 3, 4)
Для младшего разряда:
{
0: 40,
1:
2: 32, 2
3:
4: 34, 14, 24
}
[40, 32, 2, 34, 14, 24]
Для старшего разряда:
{
0: 2,
1: 14
2: 24
3: 32, 34
4: 40
}
[2, 14, 24, 32, 34, 40]
Алгоритм сортировки выполняется за линейное время.