- •Інформатика
- •Необчислювальні алгоритмы
- •Від автора
- •Створення алгоритму
- •Налагодження алгоритму
- •Допоміжні задачі
- •Поняття систем числення
- •Числова інформація Цілі числа
- •Дійсні числа
- •Текстова інформація Символи
- •Дерево. Бінарне дерево
- •If to nil then with t* do begin
- •Бінарний пошук Пошук діленням навпіл
- •Рекурсивний бінарний пошук
- •Пошук у рядку
- •Скінченні автомати Основні поняття
- •Пошук у мережі
- •Прямі методи сортування Сортування вибором
- •Сортування обміном
- •Шейкерне сортування
- •Сортування методом Шелла
- •Швидке сортування
- •Метод прямого злиття
- •Метод природного злиття
- •Сортування підрахунком
- •Цифрове сортування
- •Література
- •61012, М. Харків, вул. Енгельса, 11.
Шейкерне сортування
Шейкерне сортування ShakerSort (з ант. Shake - трясти) є покращенням методу обміну і базується на ідеї саме цього методу.
Почнемо із запитання: а чи не можна дещо покращити метод прямого обміну, з яким ми вже попередньо ознайомилися?
Для того щоб відповісти на це запитання, повернемося до прикладу, наведеного в таблиці 16. Шд час останніх трьох про-ходів по масиву не було зроблено жодного переставлення еле- I ментів! Про що це говорить? Зрозуміло, це означає, що масив уже впорядкований, а тому немає сенсу виконувати ці останні I кроки сортування. Отже, перше вдосконалення полягае в тому.
158
щоб здійснювати контроль щодо виконання хоча б одного пе-реставлення в останньому перегляді масиву. У випадку його відсутності сортування можна припиняти.
Але виявляється, що і це вдосконалення такоя; можна по-кращити. Тому друге вдосконалення полягає в тому, щоб на кожному кроці запам'ятовувати номер елемента, з яким був виконаний останній обмін. Це означатиме, що всі елементи зище від цього місця уже впорядковані. Тому наступний перегляд можна виконувати лише до цього елемента.
Ці дві ідеї щодо покращення методу прямого обміну покла-іені в основу методу шейкерного сортування.
Розглянемо два приклади масивів і відсортуємо їх методом прямого обміну.
Приклад перший:
12,18, 42, 44, 55, 67, 94, 06.
У цьому прикладі «поганий» елемент (06) знаходиться на «важкому кінці». Він «спливе» на свое місце, тобто перемутиться на перше місце в масиві, за один прохід.
Приклад другий:
94, 06,12,18, 42, 44, 56, 67.
У цьому прикладі «поганий» елемент (94) на «легкому кін-ці». Він «потоне», тобто переміститься на останнє місце в ма-сиві, за сім проходів.
Метод прямого обміну можна вдосконалити так: чергувати напрям послідовних переглядів масиву. Тепер зрозуміло, чому пей метод носить назву «шейкерного» сортування.
Розглянемо цей метод на прикладі таблиці 18.
Таблиця18
|
2 |
3 |
3 |
4 |
4 |
|
8 |
& |
7 |
7 |
4 |
|
t |
І |
t |
1 V |
t |
|
44 |
06 |
06 |
06 |
06 |
|
55 |
44 |
44 |
12 |
12 |
|
12 |
55 |
12 |
44 |
18 |
|
42 |
12 |
42 |
18 |
42 |
|
94 |
42 |
55 |
42 |
44 |
|
18 |
94 |
18 |
55 |
55 |
|
06 |
18 |
67 |
67 |
67 |
|
67 |
67 |
94 |
94 |
94 |
159
У
перших двох рядках таблиці
будемо
вказувати межі
змі-ни
індексів
елементів масиву,
який розглядається
на
даному кроді
тдодо
його апорядкування. Змінна
L
- індекс
крайнього
лівого
елемента
масиву, до якого міняється
значения
змінної
;
при викошшні
опорації a[j
—
1] > a\j\,
R
—
відповідно
крайнього
правого.
3 таблиці 18 видно, що на кожному кроці запам'ятовується порядковий елемент масиву, на якому було зроблено останній обмін, і це дає змогу значно зменшити кількість проходів масиву для отримання його остаточного відсортованого варіанта. Крім того, зміна напрямів сортування при кожному проході масиву також дає свої переваги.
Реалізащю описаного алгоритму можна представити у ви-гляді тексту такої Pascal-програми:
L := 2; R := n; k := п; repeat
for j := R downto L do if a[j-1]>a[j]then begin
| x := aU - 1]; aU - 1] := a[j]; afl] := x; k := j end; L := k + 1; for j := L to R do if a[j- 1] >a[j]then begin
| x := a[j - 1]; a[j - 1] := a[j]; aD] := x; k := j end; R:=k-1; until L > R;
Аналіз покращених методів сортування, особливо шей-керного сортування, є достатньо складним. Це пов'язане з тим, що при покращенні методов ми фактично базуемося на тій са-мій ідеї', яка закладена у базовому методі.
Слід звернути увагу на те, що всі перераховані вище по-кращення не впливають на кількість переміщень. Вони лише скорочують кількість зайвих подвійних перевірок. На жаль, обмін місцями двох елементів найчастіше більш дорога опера-ція, ніж порівняння елементів, тому нібито очевидні покра-щення дають не такий уже й великий виграш, як ми інтуїтив-но очікували.
У загальному випадку всі сортування фактично пересувають кожний елемент а. на кожному елементарному кроці на одну позипДю. Тому вони вимагають л2 таких кроків.
Отже, можна говорити, що оцінка ефективності виконання будь-якого покращеного алгоритму сортування, так само як для прямих методів, становить 0(л2).
160
При тестуванні покращених алгоритмів сортування, як і для прямих методів, треба сформувати такі вхідні дані:
-
вхідний масив уже впорядкований необхідним чином;
-
вхідний масив є частково впорядкованим;
-
вхідний масив упорядкований у зворотному порядку;
-
елементи вхідного масиву розміщені випадковим чином. Коректність алгоритму перевірити при п = 10, п » 100,
п ■= 1000, п = 10 000, ті = 30 000.
/ Запитання для самоконтролю
-
На чому базується ідея покращення методу прямого включения?
-
Який пошуковий алгоритм застосовується для покращення методу прямого включения?
-
Наведіть текст фрагмента Pascal-програми, який реалізує покращення методу прямого включения.
-
На чому базується ідея покращення методу прямого обміну?
-
Наведіть приклади послідовностей, які доводять ефективність чергування застосування методу прямого обміну від початку масиву до кінця, і навпаки.
-
Сформулюйте алгоритм шейкерного сортування.
-
Продемонструйте у вигляді таблиц! роботу методу шейкерного сортування на конкретному масиві значень.
-
Запишіть текст Pascal-програми, який реалізує алгоритм шейкерного сортування.
-
Проанапізуйте ефективність роботи покращених методів сортування.
10. Якою є оцінка ефективності роботи покращених методів сортування?
Завдання
-
Реалізувати у вигляді програми алгоритм сортування задано! послідовності за зростанням методом з двійковим включениям.
-
Реалізувати у вигляді програми алгоритм шейкерного сортування заданої послідовності за зростанням.
-
Змінити алгоритми у завданнях 1-2 так, щоб сортування відбувалося за спаданиям.
-
Протестувати реалізовані у завданнях 1-3 алгоритми для масиву 15, 4, 10, 8, 6, 9, 16, 1, 7, 3, 11, 14, 2, 5, 12, 13.
-
Проаналізувати покрокове виконання завдання 4 щодо кількості виконуваних дій.
-
Підібрати власні тести, які доводять переваги й показу-ють недоліки кожного з покращених методів сортування при п > 100.
-
Зробити письмовий аналіз завдань 4-6.
в Іиформ.іпіки. 9 I" >•• I
161
УДОСКОНАЛЕНІ МЕТОДИ СОРТУВАННЯ
