- •1. Сортування включенням Одним з найбільш простих і природних методів внутрішнього сортування є сортування з простими включеннями. Ідея алгоритму дуже проста:
- •Сортування за допомогою дерева (Heapsort)
- •Сортування із злиттям
- •Порівняння часу сортувань
- •Обчислення суми елементів масиву
- •Обчислення добутка елементів масиву
- •Видалення елементу з масиву
- •Контрольні запитання:
Сортування за допомогою дерева (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.
