Вы находитесь на странице: 1из 34

Алгоритмы программирования и структуры данных

Алгоритмы, основанные на двоичной куче

Сортировка кучей
Сортировка кучей

I Необходимо отсортировать по возрастанию массив A, содержащий n


элементов

2
Сортировка кучей

I Необходимо отсортировать по возрастанию массив A, содержащий n


элементов
I Сортировка кучей (пирамидальная сортировка, heap sort):

2
Сортировка кучей

I Необходимо отсортировать по возрастанию массив A, содержащий n


элементов
I Сортировка кучей (пирамидальная сортировка, heap sort):
I Heapsort(A)

2
Сортировка кучей

I Необходимо отсортировать по возрастанию массив A, содержащий n


элементов
I Сортировка кучей (пирамидальная сортировка, heap sort):
I Heapsort(A)
1: Build_Max_Heap(A)

2
Сортировка кучей

I Необходимо отсортировать по возрастанию массив A, содержащий n


элементов
I Сортировка кучей (пирамидальная сортировка, heap sort):
I Heapsort(A)
1: Build_Max_Heap(A)
2: for (i ← length[A] downto 2) do

2
Сортировка кучей

I Необходимо отсортировать по возрастанию массив A, содержащий n


элементов
I Сортировка кучей (пирамидальная сортировка, heap sort):
I Heapsort(A)
1: Build_Max_Heap(A)
2: for (i ← length[A] downto 2) do
3: Обменять A[1] ↔ A[i]

2
Сортировка кучей

I Необходимо отсортировать по возрастанию массив A, содержащий n


элементов
I Сортировка кучей (пирамидальная сортировка, heap sort):
I Heapsort(A)
1: Build_Max_Heap(A)
2: for (i ← length[A] downto 2) do
3: Обменять A[1] ↔ A[i]
4: heap_size[A] ← heap_size[A] − 1

2
Сортировка кучей

I Необходимо отсортировать по возрастанию массив A, содержащий n


элементов
I Сортировка кучей (пирамидальная сортировка, heap sort):
I Heapsort(A)
1: Build_Max_Heap(A)
2: for (i ← length[A] downto 2) do
3: Обменять A[1] ↔ A[i]
4: heap_size[A] ← heap_size[A] − 1
5: Max_Heapify(A, 1)

2
Пример сортировки кучей

17

13 15

12 11 14

17 13 15 12 11 14

3
Пример сортировки кучей

17 14

13 15 13 15

12 11 14 12 11

17 13 15 12 11 14 14 13 15 12 11 17

3
Пример сортировки кучей

17 14 15

13 15 13 15 13 14

12 11 14 12 11 12 11

17 13 15 12 11 14 14 13 15 12 11 17 15 13 14 12 11 17

3
Пример сортировки кучей

17 14 15 11

13 15 13 15 13 14 13 14

12 11 14 12 11 12 11 12

17 13 15 12 11 14 14 13 15 12 11 17 15 13 14 12 11 17 11 13 14 12 15 17

3
Пример сортировки кучей

17 14 15 11

13 15 13 15 13 14 13 14

12 11 14 12 11 12 11 12

17 13 15 12 11 14 14 13 15 12 11 17 15 13 14 12 11 17 11 13 14 12 15 17

14

13 11

12

14 13 11 12 15 17

3
Пример сортировки кучей

17 14 15 11

13 15 13 15 13 14 13 14

12 11 14 12 11 12 11 12

17 13 15 12 11 14 14 13 15 12 11 17 15 13 14 12 11 17 11 13 14 12 15 17

14 12

13 11 13 11

12

14 13 11 12 15 17 12 13 11 14 15 17

3
Пример сортировки кучей

17 14 15 11

13 15 13 15 13 14 13 14

12 11 14 12 11 12 11 12

17 13 15 12 11 14 14 13 15 12 11 17 15 13 14 12 11 17 11 13 14 12 15 17

14 12 13

13 11 13 11 12 11

12

14 13 11 12 15 17 12 13 11 14 15 17 13 12 11 14 15 17

3
Пример сортировки кучей

17 14 15 11

13 15 13 15 13 14 13 14

12 11 14 12 11 12 11 12

17 13 15 12 11 14 14 13 15 12 11 17 15 13 14 12 11 17 11 13 14 12 15 17

14 12 13 11

13 11 13 11 12 11 12

12

14 13 11 12 15 17 12 13 11 14 15 17 13 12 11 14 15 17 11 12 13 14 15 17

3
Пример сортировки кучей

17 14 15 11

13 15 13 15 13 14 13 14

12 11 14 12 11 12 11 12

17 13 15 12 11 14 14 13 15 12 11 17 15 13 14 12 11 17 11 13 14 12 15 17

14 12 13 11 12

13 11 13 11 12 11 12 11

12

14 13 11 12 15 17 12 13 11 14 15 17 13 12 11 14 15 17 11 12 13 14 15 17 12 11 13 14 15 17

3
Пример сортировки кучей

17 14 15 11

13 15 13 15 13 14 13 14

12 11 14 12 11 12 11 12

17 13 15 12 11 14 14 13 15 12 11 17 15 13 14 12 11 17 11 13 14 12 15 17

14 12 13 11 12 11

13 11 13 11 12 11 12 11

12

14 13 11 12 15 17 12 13 11 14 15 17 13 12 11 14 15 17 11 12 13 14 15 17 12 11 13 14 15 17 11 12 13 14 15 17

3
Анализ времени работы сортировки
кучей (1)

I Оценим сверху время работы процедуры построения кучи, массив A состоит


из n элементов

4
Анализ времени работы сортировки
кучей (1)

I Оценим сверху время работы процедуры построения кучи, массив A состоит


из n элементов
I Build_Max_Heap(A)

4
Анализ времени работы сортировки
кучей (1)

I Оценим сверху время работы процедуры построения кучи, массив A состоит


из n элементов
I Build_Max_Heap(A)
1: heap_size ← length[A]

4
Анализ времени работы сортировки
кучей (1)

I Оценим сверху время работы процедуры построения кучи, массив A состоит


из n элементов
I Build_Max_Heap(A)
1: heap_size ← length[A]
length[A]
2: for (i ← b 2 c downto 1) do

4
Анализ времени работы сортировки
кучей (1)

I Оценим сверху время работы процедуры построения кучи, массив A состоит


из n элементов
I Build_Max_Heap(A)
1: heap_size ← length[A]
length[A]
2: for (i ← b 2 c downto 1) do
3: Max_Heapify(A, i)

4
Анализ времени работы сортировки
кучей (1)

I Оценим сверху время работы процедуры построения кучи, массив A состоит


из n элементов
I Build_Max_Heap(A)
1: heap_size ← length[A]
length[A]
2: for (i ← b 2 c downto 1) do
3: Max_Heapify(A, i)
I В процессе работы Build_Max_Heap(A) от каждого внутреннего узла
создаваемой кучи вызывается процедура восстановления свойства
невозрастания кучи Heapify

4
Анализ времени работы сортировки
кучей (1)

I Оценим сверху время работы процедуры построения кучи, массив A состоит


из n элементов
I Build_Max_Heap(A)
1: heap_size ← length[A]
length[A]
2: for (i ← b 2 c downto 1) do
3: Max_Heapify(A, i)
I В процессе работы Build_Max_Heap(A) от каждого внутреннего узла
создаваемой кучи вызывается процедура восстановления свойства
невозрастания кучи Heapify
I Число вызовов процедуры Heapify не может превышать n

4
Анализ времени работы сортировки
кучей (1)

I Оценим сверху время работы процедуры построения кучи, массив A состоит


из n элементов
I Build_Max_Heap(A)
1: heap_size ← length[A]
length[A]
2: for (i ← b 2 c downto 1) do
3: Max_Heapify(A, i)
I В процессе работы Build_Max_Heap(A) от каждого внутреннего узла
создаваемой кучи вызывается процедура восстановления свойства
невозрастания кучи Heapify
I Число вызовов процедуры Heapify не может превышать n
I Время работы процедуры Heapify составляет O(log n)

4
Анализ времени работы сортировки
кучей (1)

I Оценим сверху время работы процедуры построения кучи, массив A состоит


из n элементов
I Build_Max_Heap(A)
1: heap_size ← length[A]
length[A]
2: for (i ← b 2 c downto 1) do
3: Max_Heapify(A, i)
I В процессе работы Build_Max_Heap(A) от каждого внутреннего узла
создаваемой кучи вызывается процедура восстановления свойства
невозрастания кучи Heapify
I Число вызовов процедуры Heapify не может превышать n
I Время работы процедуры Heapify составляет O(log n)
I Таким образом, время работы процедуры Build_Max_Heap(A) можно
оценить как O(n log n)

4
Анализ времени работы сортировки
кучей (1)

I Оценим сверху время работы процедуры построения кучи, массив A состоит


из n элементов
I Build_Max_Heap(A)
1: heap_size ← length[A]
length[A]
2: for (i ← b 2 c downto 1) do
3: Max_Heapify(A, i)
I В процессе работы Build_Max_Heap(A) от каждого внутреннего узла
создаваемой кучи вызывается процедура восстановления свойства
невозрастания кучи Heapify
I Число вызовов процедуры Heapify не может превышать n
I Время работы процедуры Heapify составляет O(log n)
I Таким образом, время работы процедуры Build_Max_Heap(A) можно
оценить как O(n log n)
I Примечание: можно получить более точную оценку O(n)
I Cм. Т. Кормен и др. «Алгоритмы. Построение и анализ», 2 изд., раздел 6.3

4
Анализ времени работы сортировки
кучей (2)

I Оценим время работы сортировки кучей

5
Анализ времени работы сортировки
кучей (2)

I Оценим время работы сортировки кучей


I Heapsort(A)
1: Build_Max_Heap(A)
2: for (i ← length[A] downto 2) do
3: Обменять A[1] ↔ A[i]
4: heap_size[A] ← heap_size[A] − 1
5: Max_Heapify(A, 1)

5
Анализ времени работы сортировки
кучей (2)

I Оценим время работы сортировки кучей


I Heapsort(A)
1: Build_Max_Heap(A)
2: for (i ← length[A] downto 2) do
3: Обменять A[1] ↔ A[i]
4: heap_size[A] ← heap_size[A] − 1
5: Max_Heapify(A, 1)
I Время работы процедуры Build_Max_Heap(A) составляет T1 (n) = O(n log n)

5
Анализ времени работы сортировки
кучей (2)

I Оценим время работы сортировки кучей


I Heapsort(A)
1: Build_Max_Heap(A)
2: for (i ← length[A] downto 2) do
3: Обменять A[1] ↔ A[i]
4: heap_size[A] ← heap_size[A] − 1
5: Max_Heapify(A, 1)
I Время работы процедуры Build_Max_Heap(A) составляет T1 (n) = O(n log n)
I Каждый из n − 1 вызовов процедуры Max_Heapify требует O(log n), таким
образом, время выполнения цикла for составляет T2 (n) = O(n log n)

5
Анализ времени работы сортировки
кучей (2)

I Оценим время работы сортировки кучей


I Heapsort(A)
1: Build_Max_Heap(A)
2: for (i ← length[A] downto 2) do
3: Обменять A[1] ↔ A[i]
4: heap_size[A] ← heap_size[A] − 1
5: Max_Heapify(A, 1)
I Время работы процедуры Build_Max_Heap(A) составляет T1 (n) = O(n log n)
I Каждый из n − 1 вызовов процедуры Max_Heapify требует O(log n), таким
образом, время выполнения цикла for составляет T2 (n) = O(n log n)
I Общее время работы алгоритма: T(n) = T1 (n) + T2 (n) = O(n log n)