HeapSort

{ai}, i=0,…,n-1. Сортируем по возрастанию.

 

Массив называется *-упорядоченным если выполняется свойство *:

aia2i+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

//на выходе свойство * выполняется для всех ji

Текущий эл-т имеет индекс 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

Ч.Т.Д.