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).