Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекція 6 оп.doc
Скачиваний:
13
Добавлен:
14.08.2019
Размер:
248.32 Кб
Скачать

Сортування за допомогою дерева (Heapsort)

Почнемо з простого методу сортування за допомогою дерева, при використанні якого явно будується двійкове дерево порівняння ключів. Побудова дерева починається з листя, яке містить всі елементи масиву. З кожної сусідньої пари вибирається найменший елемент, і ці елементи утворюють наступний (ближче до Корню рівень дерева). З кожної сусідньої пари вибирається найменший елемент і так далі, поки не буде побудований корінь, що містить найменший елемент масиву. Двійкове дерево порівняння для масиву, використовуваного в наших прикладах, показане на малюнку 2.1. Отже, ми вже маємо найменше значення елементів масиву. Для того, щоб отримати наступний по величині елемент, спустимося від кореня по шляху, ведучому до листа з найменшим значенням. У цій листовій вершині проставляється фіктивний ключ з "нескінченно великим" значенням, а у всі проміжні вузли, що займалися найменшим елементом, заноситься найменше значення з вузлів - безпосередніх нащадків (мал. 2.2). Процес продовжується до тих пір, поки всі вузли дерева не будуть заповнені фіктивними ключами (малюнки 12 - 19).

8 23 5 65 44 33 1 6

мал. 12.

мал. 13. Другий крок

мал. 14. Третій крок

мал. 15. Четвертий крок

мал. 16. П'ятий крок

мал. 17. Шостий крок

мал. 18. Сьомий крок

мал. 19. Восьмий крок

На кожному з n кроків, потрібних для сортування масиву, потрібно log n (двійковий) порівнянь. Отже, всього буде потрібно n?log n порівнянь, але для представлення дерева знадобиться 2n - 1 додаткових одиниць пам'яті.

Сортування із злиттям

Сортування із злиттям, як правило, застосовуються в тих випадках, коли потрібно відсортувати послідовний файл, що не поміщається цілком в основній пам'яті. Існують і ефективні методи внутрішнього сортування, засновані на розбитті і злитті.

Один з популярних алгоритмів внутрішнього сортування із злиттям заснований на наступних ідеях (для простоти вважатимемо, що число елементів в масиві, як і в нашому прикладі, є ступенем числа 2). Спочатку пояснимо, що таке злиття. Хай є два відсортованих в порядку зростання масиву p[1], p[2] ..., p[n] і q[1], q[2] ..., q[n] і є порожній масив r[1], r[2] ..., r[2?n], який ми хочемо заповнити значеннями масивів p і q в порядку зростання. Для злиття виконуються наступні дії: порівнюються p[1] і q[1], і менше із значень записується в r[1]. Припустимо, що це значення p[1]. Тоді p[2] порівнюється з q[1] і менше із значень заноситься в r[2]. Припустимо, що це значення q[1]. Тоді на наступному кроці порівнюються значення p[2] і q[2] і так далі, поки ми не досягнемо меж одного з масивів. Тоді залишок іншого масиву просто дописується в "хвіст" масиву r.

Для сортування із злиттям масиву а, а, ..., а[n] заводиться парний масив b[1], b[2] ..., b[n]. На першому кроці проводиться злиття а[1] і а[n] з розміщенням результату в b[1], b[2], злиття а[2] і а[n-1] з розміщенням результату в b[3], b[4] ..., злиття а[n/2] і а[n/2+1] з приміщенням результату в b[n-1], b[n]. На другому кроці проводиться злиття пар b[1], b[2] і b[n-1], b[n] з приміщенням результату в а, а, а, а, злиття пар b[3], b[4] і b[n-3], b[n-2] з приміщенням результату в а, а, а, а, ..., злиття пар b[n/2-1], b[n/2] і b[n/2+1], b[n/2+2] з приміщенням результату в а, а, а, а[n]. І так далі На останньому кроці, наприклад (залежно від значення n), проводиться злиття послідовностей елементів масиву завдовжки n/2 а, а, ..., а[n/2] і а, а, ..., а[n] з приміщенням результату в b[1], b[2] ..., b[n].

Для випадку масиву, використовуваного в наших прикладах, послідовність кроків показана в таблиці 3.

Таблиця 3. Приклад сортування із злиттям

Початковий стан масиву

8 23 5 65 44 33 1 6

Крок 1

6 8 1 23 5 33 44 65

Крок 2

6 8 44 65 1 5 23 33

Крок 3

1 5 6 8 23 33 44 65

Мал. 25.

Приклад злиття двох масивів показаний на малюнку 25.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]