HeapSort
{ai},
i=0,…,n-1. Сортируем по
возрастанию.
Массив называется *-упорядоченным если выполняется свойство *:
ai≥
a2i+1
(i≥0, 2i+1<n)
ai≥ a2i+2 (i≥0,
2i+2<n)
0
1 2
3 4 5 6
---
Heapify(a,n, i)
//на входе свойство
* выполняется для всех j>i
//на выходе свойство
* выполняется для всех j≥i
Текущий эл-т имеет индекс i
Пусть a2i+1 – максимальный из трех (ai, a2i+1, a2i+2)
Меняем местами ai и a2i+1
i=2i+1
---
Утверждение.
Время работы Heapify(a,n, i) = T(n,a,i)=O(log
n).
HeapSort.
1. Строим пирамиду: for(i=n-2;i>=0;i--)
Heapify(a,n, i)
2. for(l=n-1;l>=1;l--){SWAP(a[0],a[l]);
Heapify(a,l, 0)}
Теорема. Алгоритм HeapSort работает за время = O(n log n)
Сортировка подсчетом
{ai},
i=0,…,n-1; ai∈
ℕ0;
0≤ ai<B∈ ℕ0
.
{bj}, j=0,…,B-1: bj
= количество эл-тов {ai}
≤ j
1.
{bj} = количество эл-тов {ai} = j
=>
2. {bj} = количество эл-тов {ai} ≤ j
1.
Обнуляем массив b
Для всех ai: b[a[i]]++
2.
Для всех bj: b[j]+=b[j-1]
for(i=n-1;i≥0;i--){r[b[a[i]]-1]=a[i];b[a[i]]--;}
Устойчивая сортировка = сортировка, не меняющая порядок равных эл-тов
Теорема. Алгоритм сортировки подсчетом устойчив и работает за время = Θ(Max(B,n)).
Например если B=O(n), то Алгоритм сортировки подсчетом устойчив и работает за время = Θ(n).
Теорема. Алгоритм цифровой сортировки с использованием
сортировки подсчетом массива целых чисел размером n>60000 устойчив
и работает за время = Θ(n).
HeapSort
{ai},
i=0,…,n-1. Сортируем по
возрастанию.
Массив
называется *-упорядоченным если выполняется свойство
*:
ai≥ a2i+1 (i≥0,
2i+1<n)
ai≥ a2i+2 (i≥0,
2i+2<n)
0 i=1
1 2 i=2
3
4 5 6 i=h
Время работы
построения пирамиды [Строим пирамиду: for(i=n-2;i>=0;i--) Heapify(a,n, i)]:
=…
Теорема. Время работы построения пирамиды =Θ(n).
Порядковые
статистики.
{ai}, i=0,…,n-1, ai∈ ℝ
Порядковая статистика с номером k для {ai} = k-ый
элемент в упорядоченном множестве {ai}.
Теорема. Алгоритм нахождения статистики с использованием сортировки делением
пополам без рекурсии требует Θ(1) доп.памяти
в стеке и Θ(n) доп.памяти
в куче; алгоритм работает за время O(n log n).
Теорема. Алгоритм FindStat2 требует Θ(1) доп.памяти в стеке и Θ(n) доп.памяти в куче; алгоритм работает за время O(n2).
Алгоритм работает за время Θ(n) в среднем по всем перестановкам массива из n различных чисел.
Пусть T(i)≤
ai для i<n.
Среднее время поиска k-ой порядковой статистики = T(n)≤
( O(n)+max(T(1),T(n-1))
+∑i=2n(O(n)+max(T(i-1),T(n-i+1)))
)/n =
O(n)+=O(n)+2a
(n/2)3/4 =O(n)+a3/4 n=an +(O(n)-a n/4)=[выбираем a]≤ an
Ч.Т.Д.