Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
О.О.П / ооп / 4_кол / К курсовой / Методи побудови алгоритмів та їх аналіз / Інформатика_1 (методи побудови алгоритмівта та їх аналіз).doc
Скачиваний:
0
Добавлен:
30.05.2020
Размер:
2.5 Mб
Скачать

Цифрове сортування

Алгоритм цифрового сортування RadixSort колись застосо-вувався у машинах для сортування перфокарт. В обчислюваль-них машинах першого покоління перфокарти, картонні карткй використовувалися для збереження інформації. На них за до-

199

помогою пристроїв, які називалися перфораторами, пробивали-ся дірки. На перфокарта у 80 колонках у певних позиціях мож­на було пробити до 12 дірок. Комбінації цих пробитих дірок від-повідали певному символу, тобто на кожній перфокарті можна було набити інформацію з 80 символів. Цифри від 0 до 9 кодува-лися дірками у відповідних рядках 0-9 у колонках, що відпові-дали даній цифрі (див. с. 50).

Сортувальні машини за вказаним стовпчиком, по якому не-обхідно було виконати сортування перфокарт, розкладали ко­лоду перфокарт на 10 стосів залежно від того, яка з дірок 0-9 була пробита у вказаному стовпчику.

Ця ідея і лягла в основу алгоритму цифрового сортування масиву. Сформулюемо Е£.

Нехай задано масив цілих чисел, максимальна розрядність яких дорівнює d. Для прикладу розглянемо масив із 7 цілих трицифрових чисел:

329, 457, 657, 839, 436, 720, 355.

Розглянемо спочатку молодші розряди кожного елемента масиву. Там можуть бути цифри від 0 до 9. Розкладемо всі чис­ла на 10 стосів: у перший - числа, які мають молодшу цифру 0, у другий - 1, у третій - 2, і т. д., у десятий - 9 (мал. 85).

720

355

436

657 457

839 329

0123456789

Мал. 85

Тепер складемо стоси чисел знову разом, зберігаючи первин-ну послідовність чисел у кожному стосі відносно їх ПОСЛІДОВ-ності в заданому масиві:

720, 355, 436, 457, 657, 329, 839.

На другому кроці сортування будемо цей масив розкладати на стоси відповідно до цифр десятків кожного числа (мал. 86).

329 720

839

43G

657 457 355

о

8

12 3 4 5 6 7

Мал. 86

Склавши отримані числа зі стосів один за одним, отримаємо: 720, 329, 436, 839, 355, 457, 657. 200

Залишився один останній крок для розкладання чисел по стосах відповідно до старших розрядів, тобто цифр сотень кож­ного числа (мал. 87).

355 329

457 436

657

720

839

0123456789

Мал. 87

Запишемо числа, отримані у стосах, зберігаючи їх порядок у масиві, з якого вони потрапили у ці стоси. Результатом буде відсортований масив чисел:

329, 355, 436, 457, 657, 720, 839.

За три кроки отримали результат роботи алгоритму цифро­вого сортування. Чому саме за три? Зрозуміло - це прямо по-в'язано з кількістю цифр у найбільшому числі. До оцінки ефек-тивності роботи даного алгоритму звернемося пізніше.

А зараз давайте спробуємо записати алгоритм цифрового сортування:

1) зарезервуватимісце для 10 додаткових масивівAg, Av ...,Ад (довжина їх повинна збігатися з довжиною вхідного масиву, оскільки можна підібрати такий тест, щоб усі елементи вхід- ного масиву попали в один стос);

2) визначити розрядність найбільшого числа вхідного масиву; 3)визначити і = 1;

  1. виділити в кожному числі заданого масиву і-у цифру і пе-реписати всі числа, починаючи з першого і завершуючи остан-нім, у додатковии масив, порядковии номер якого збігається з і-ю цифрою поточного числа;

  2. переписати числа з масивів А0, А., ..., А9 у вхідний масив, зберігаючи їх послідовність у додаткових масивах;

  3. збільшити і на 1 і якщо і не перевищує розрядності най-більшого числа, то перейти до пункту 4.

А тепер запишемо алгоритм цифрового сортування елемен-тів одновимірного масиву у вигляді тексту фрагмента Pascal-програми. Для спрощення вважатимемо, що значениями еле-ментів масиву є натуральні числа.

(Пошук максимального елемента вхідного масиву.} read (х[1]); max :=х[1]; for i := 2 to n do begin

read (x[i]);

if x[i] > max then max :=x[i]; end;

201

d := 0; {Визначення розрядності максимального числа.)

while max > 0 do begin inc (d);

max := maxdiv 10 end; count := 1;

for i := 1 to d do {Порозрядний перегляд елементів масиву.}

begin

{Ініціалізація кількості елементів у масивахЛ0, ...,Ад.) forj :=0to9dok[j] :=0;

for j : = 1 to n do {Розміщення елементів масиву x по масивам А0,.... А9.) begin

digit := (x[j] div count) mod 10; inc (k[digit]); A[digit][k[digit]]:=x[j] end; count := count * 10; {Визначення наступного розряду елементів масиву.} j := 1; {Злиття елементів з масивів А0, ...,/19у масивх.}

for q := 0 to 9 do forw:= 1 to k[q] do begin

x[j]:=A[q][w]; inc(j) end; end;

Перейдемо до визначення оцінки ефективності роботи ал­горитму цифрового сортування елементів масиву. її можна об-рахувати, проаналізувавши наведений текст програми. Та частина програми, яка безпосередньо виконує сортування масиву, складається з двох вкладених циклів: перший for і := 1 to d do залежить від кількості знаків найбільшого числа заданого масиву, а другий for j := 1 to n do - від кількості елементів цього масиву. Усередині зовнішнього циклу є где один цикл for q := 0 to 9 do, який збирає елементи, розкладені по стосам, в один масив. Він загалом переглядає п елементів заданого масиву. Тому результатом такого аналізу перегляду п елементів масиву буде d(n + п) - 2dn. Оскільки величина d є значно малою порівняно з п (maxlongint = 2147483647), то оцінкою ефективності роботи алгоритму цифрового сортуван­ня можна вважати 0(п).

Цифрове сортування досить чутливе до кількості вхідних даних. Тому при тестуванні цього алгоритму необхідно вра-хувати саме цей фактор. Але традиційно коректність його робо­ти перевірятимемо при п > 100 на таких вхідних даних:

  • вхідний масив уже впорядкований необхідним чином;

  • вхідний масив є частково впорядкованим;

202

  • вхідний масив упорядкований у зворотному порядку;

  • елементи вхідного масиву розміщені випадковим чином.

/ Запитання для самоконтролю

  1. Якою є історія застосування алгоритму цифрового сортуванкя?

  2. У чому полягає ідея алгоритму цифрового сортування?

  1. Продемонструйте на власному прикладі роботу алгоритму циф­рового сортування.

  2. Сформулюйте алгоритм цифрового сортування у словесній формі.

  3. Запишіть текст Pascal-програми, що реалізує алгоритм цифро­вого сортування одновимірного масиву.

  4. Проаналізуйте переваги й обмеження щодо використання мето­ду цифрового сортування.

  5. Якою є оцінка ефективності роботи алгоритму, що реалізує ме­тод цифрового сортування одновимірного масиву? Обґрунтуйте свою відповідь.

Завдання

  1. Реалізувати у вигляді прогреми алгоритм цифрового сор­тування заданої послідовності за зростанням.

  2. Модифікувати алгоритм, реалізований у завданні 1, так, гцоб сортування відбувалося за спаданиям.

  3. Протестувати реалізовані у завданнях 1-2 алгоритми для масиву 15, 4, 10, 8, 6, 9, 16, 1, 7, 3, 11, 14, 2, 5, 12, 13.

  4. Проаналізувати покрокове виконання завдання 3 щодо кількості виконуваних дій.

  5. Шдібрати власні тести, які доводить переваги й показу-ють недоліки методу цифрового сортування при п > 100.

  6. Зробити письмовий аналіз завдань 3-5.

ПОРІВНЯННЯ МЕТОДІВ СОРТУВАННЯ

Завершуючи ознайомлення з різноманітними та різноплано-вими методами сортування, на останок спробуємо порівняти їх ефективність. Традиційно вважатимемо п кількістю елементів масиву, що сортується.

Для того щоб порівняння алгоритмів, що реалізують відпо-відні методи сортування, було достатньо наочним, заноситиме-мо час їх виконання в таблицю з параметрами, які визначають таке початкове формування елементів вхідного масиву: упо­рядкований за зростанням Growth, визначений випадковим чи­ном Random, упорядкований за спаданиям Decrease. Нага-дуемо, що робота всіх алгоритмів сортування спрямована на сортування вхідних масивів за зростанням.

203

Оскільки замір часу виконання алгоритмів залежить не лише від кількості елементів масивів, а й від технічних харак­теристик комп'ютера, на якому вони тестувалися, то зазначи-мо, що тестування відбувалося на комп'ютері AMD Duron, 1.00 ГТц, 128 МБ ОЗУ. Вибір саме такого комп'ютера спри-чинено тим, що на потужніших комп'ютерах досить важко за-фіксувати час виконання програм, що реалізують «швидкі» алгоритми, особливо ті, які певним чином обмежують кіль-кість оброблювальних елементів (наприклад, сортування за лі-нійний час). I навпаки, на «повільніших» машинах ыеможливо дочекатися результату роботи програм, що реалізують прямі методи сортування.

Як уже зазначалося, для фіксації часу роботи програми, що реалізує розроблений алгоритм, можна застосувати таку змінну:

var timer: longint absolute $40: $6c.

Зазначимо також (див. с. 23), що під час тестування програм фіксувався «чистий» час їх роботи, тобто не враховувалося вве­дения вхідної інформації та виведення результуючого відсорто-ваного масиву. Тобто загальний вигляд програми був таким:

timeold := timer;

<програма>

writeln ((timer - timeold) /18. 2);

Під час тестування виявилося, що на обраному комп'ютері не для всіх тестів і не для всіх алгоритмів вдалося зафіксувати час. При такій ситуації в таблицю заносився коментар «no time». I ще: для спрощення замість log2n будемо вказувати logn.

Шсля обговорення всіх технічних питань перейдемо безпосе-редньо до проведения порівняння методів сортування (табл. 19).

Таблица 19

Тип методу

Назва методу

Оцінка

Тип

Growth

Random

Decrease

N = 1000

Прямі

методи

Вибором

п-

word

no time

no time

no time

Обміном

пг

word

no time

0,055

0,055

Включениям

п1-

word

no time

no time

0,055

о Si ф

Бінарне включения

пг

word

no time

no time

no time

Шейкерие сортування

пг

word

no time

no time

no time

204

Продовження таблиці 19

Тип методу

Назва методу

Оцінка

Тип

Growth

Random

Decrease

Удоско-

налені

методи

Метод Шелла

л log л

word

no time

no time

no time

Пірамідальне сортування

л log л

word

no time

no time

no time

Швидке сортування

л log л

word

no time

no time

no time

Сортуван-

НЯ ПОСЛІ-

довностей

Пряме злиття

л [log л]

word

no time

no time

no time

Природне злиття

л [logл]

word

no time

no time

no time

Лінійне

сорту-

вання

Сортування підрахунком

л

word

no time

no time

no time

Цифрове сортування

л

word

no time

no time

no time

N = 5000

Прямі методи

Вибором

пг

word

0,1648

0,1648

0,2198

Обміном

п*

word

0,275

0,495

0,659

Включениям

п2

word

no time

0,1648

0,385

hi

Бінарне включения

л2

word

no time

0,1099

0,275

Шейкерне сортування

л2

word

no time

0,44

0,66

Удоско-

валені

методи

Метод Шелла

n]ogn

word

no time

no time

no time

Пірамідальне сортування

л log л

word

no time

no time

no time

Швидке сортування

nlogn

word

no time

no time

no time

Сортуван-

НЯ ПОСЛ1-

довностей

Пряме злиття

л [logл]

word

no time

no time

no time

Природне злиття

л [log л]

byte

no time

no time

no time

щ

Сортування підрахунком

л

word

no time

no time

no time

Цифрове сортування

я

word

no time

no time

no time

N=10 000

Прямі методи

Вибором

л2

word

0,659

0,659

0,879

Обміном

л2

word

1,044

2,088

2,582

Включениям

л2

word

no time

0,714

1,538

205

Продовжепня таблиці 19

Тип методу

Назва методу

Оцінка

Тип

Growth

Random

Decrease

Покре­щен! методи

Бінарне включения

л2

word

no time

0,055

1,099

Шейкерне сортування

л2

word

по time

1,648

2,692

Удоско-

налені

методи

Метод Шелла

nlogn

word

по time

по time

по time

Шрамідальне сортування

л log л

word

по time

по time

по time

Швидке сортування

nlogn

word

по time

по time

по time

Сортуван-

НЯ ПОСЛІ-

довностей

Пряме злиття

n[\ogn]

word

по time

по time

по time

Природне злиття

n[\ogn]

byte

по time

0,165

по time

Лінійне

сорту-

вання

Сортування підрахунком

n

word

по time

по time

по time

Цифрове сортування

n

word

по time

по time

по time

JV=15 000

Прямі методи

Вибором

л2

word

1,484

1,484

1,978

Обміном

n1

word

2,418

4,78

5,934

Включениям

n-

word

по time

1,648

3,352

Покра-

щені

методи

Бінарне включения

n2

word

по time

1,209

2,418

Шейкерне сортування

n2

word

по time

3,736

5,989

Удоско-

налені

методи

Метод Шелла

nlogn

word

по time

по time

по time

Пірамідальне сортування

nlogn

word

по time

по time

по time

Швидке сортування

nlogn

word

по time

по time

по time

Сортуван-ня ПОСЛІ-довностей

Пряме злиття

л [logл]

word

по time

по time

по time

Природне злиття

л [log я]

Масив не можна визначити

Лівійне

сорту-

вання

Сортування підрахунком

л

word

по time

по time

по time

Цифрове сортування

л

Масив не можна визначити

206

Продовження таблиці 19

Тип методу

Назва методу

Оціика

Тип

Growth

Random

Decrease

N = 20 000

Прямі

методи

Вибором

rr

word

2,692

2,692

3,516

Обміном

л2

word

4,34

8,407

10,38

Включениям

л2

word

no time

2,967

5,989

Покре­щен! методи

Бінарне включения

л2

word

no time

2,143

4,286

Шейкерне сортування

л2

word

no time

6,593

10,55

Удоско-налені

методи

Метод Шелла

л log л

word

no time

no time

0,055

Пірамідальне сортування

л log л

word

no time

no time

no time

Швидке сортування

л log л

word

no time

no time

no time

Сортуван-

НЯ П0СЛ1-

довностей

Пряме злиття

л [log л]

byte

no time

0,055

0,055

Природне злиття

л [log л]

Масив не можна визначити

Лінійне

сорту-

вання

Сортування підрахунком

л

word

no time

no time

no time

Цифроне сортування

л

Масив не можна визначити

N = 30 000

Прямі методи

Вибором

л2

word

5,989

5,989

7,802

Обміном

л2

word

9,615

18,79

23,35

Включениям

л2

word

no time

6,648

13,35

Покре­щен! методи

Бінарне включения

л2

word

no time

4,89

9,67

Шейкерне сортування

л2

word

no time

15,22

24,01

Удоско-

налені

методи

Метод Шелла

л log л

byte

0,055

0,055

0,055

Шрамідальне сортування

л log л

word

0,055

0,055

0,055

Швидке сортування

л log л

word

no time

no time

no time

Сортуван-

ня ПОСЛІ-

довностей

Пряме злиття

л [log л]

byte

0,055

0,055

0,055

Природне злиття

n[logn]

Масив не можна визначити

207

Закінчєння таблиці 19

Тип методу

Назва методу

Оцінка

Тип

Growth

Random

Decrease

III

Сортування підрахунком

п

word

0,055

0,055

0,055

Цифрове сортування

п

Масив не можна визначити

Проаналізуємо отримані результати тестування алгоритмів сортування за складністю їх виконання.

Серед усіх прямих методів можна визначити, що найгірше себе поводить метод обміну. Причому за результатами тесту­вання цього методу дуже добре видно, якою є «вартість» опера-цій порівняння та обміну елементів масиву. Наприклад, для N - 30 000 час виконання алгоритму на впорядкованому за зростанням масиві становить 9,615 с, на випадковому — 18,79 с, на впорядкованому за спаданиям - 23,35 с. Це означав, що, впорядковуючи за зростанням уже впорядкований масив, алго­ритм прямого обміну виконує лише операції порівняння всіх пар елементів і не виконує операцій обміну. Упорядковуючи за зростанням масив елементів, значения яких є випадковими числами, виконуються ті самі операції порівняння та близько половини елементів обмінюються своїми значениями. Під час упорядкування за зростанням масиву елементів, які були впо-рядковані за спаданням, відбуваються ті самі операції порів-няння та всі елементи міняються місцями. Це означав, що час виконання обміну значень елементів масиву вдвічі більший, ніж їх порівняння. Тому можна зробити висновок, що при складанні алгоритмів бажано уникати не тільки зайвих порів-нянь, а й у першу чергу зайвих обмінів!

Тестування методу включения доводить той факт, що він дуже чутливий до часткової впорядкованості вхідного масиву. Час упорядкування впорядкованого масиву не фіксується зов-сім, незалежно від кількості елементів масиву. А для впо­рядкованого за спаданням масиву (N - 30 000) час виконання алгоритму вдвічі більший (13,35 с), ніж для випадково за-даних значень елементів (6,648 с). Це пояснюється тим, що в упорядкованому за спаданням масиві жоден елемент не стоїть на своему місці щодо впорядкування за зростанням і для всіх цих елементів треба робити обміни місцями, а у випадковому масиві таких елементів є близько половини.

Метод выбору абсолютно нечутливий до часткової впоряд-кованості вхідного масиву. Він за однаковий час сортуе як повністю впорядкований масив, так і випадково сформований масив. Але в деяких випадках він досить непогано виглядае на фоні інших методів сортування.

ZQS

Для покращених методів порівняльна картина така. Метод бінарного включения підтверджує свою ефективність порів-няно з методом шейкерного сортування. Слід зазначити, що обидва ці методи абсолютно не реагують на кількість елементів масиву у випадку, коли він уже впорядкований за зростанням: алгоритми обмежуються лише операціями порівняння і не ви-конують жодних обмінів. Час виконання на будь-яких масивах не фіксується. На двох інших масивах — випадковому та впо-рядкованому за спаданиям — відношення часу виконання ал-горитмів різне. Для методу бінарного включения час для цих двох варіантів масивів відноситься приблизно як 1:2, а для шейкерного сортування як 1:1,5. Це можна пояснити так: метод бінарного включения робить швидкий пошук місця положения елемента at у масиві av ..., о,., але з постійним рекурсивним поділом цього масиву навпіл, а метод шейкерного сортування на кожному кроці враховує те, що певні частини масиву на початку й у кінці вже впорядковані. Але загалом переваги методу бінарного включения перед методом шей­керного сортування незаперечні.

У свою чергу метод бінарного включения значно покращуе результати сортування на тих самих масивах порівняно з ме­тодом прямого включения, а метод шейкерного сортування -порівняно з методом обміну.

Тепер перейдемо до удосконалених методів. Лідером у цій групі, так само як і серед усіх методів загалом, є метод швидко-го сортування. 3 таблиці 19 видно, що для різних як за дов-жиною, так і за розташуванням елементів масивів не вдалося зафіксувати час виконання цього алгоритму. Друге місце за ним посідає метод пірамідального сортування: лише на масиві у 30 000 елементів фіксується зовсім незначний час виконання цього алгоритму, причому абсолютно однаковий для всіх трьох видів масивів - 0,055 с. Метод Шелла, який використовує принцип бар'єрів, посідає трете місце, оскільки з-за викорис-тання додаткової пам'яті виникають проблеми з обмеженням на розмірність масиву вхідних даних. Алгоритм, що реалізує метод Шелла без використання бар'єрів, виявився неефек-тивним за часом виконання. Наприклад, для N = 10 000 і для довільного розташування елементів масиву він дає 8,132 с.

Особливе місце, як і передбачалося, займають методи сор­тування послідовностей. Метод прямого злиття не дає мож-ливості зафіксувати час виконання алгоритму для масивів, значения елементів яких займае 2 байти (word або integer) i кількість яких не перевищує 15 000. Для N = 20 000 та N - 30 000 можна розмістити в пам'яті комп'ютера лише зна­чения елементів типу byte, i час виконання алгоритму є дуже незначним, але все ж таки фіксується: 0,055 с. Використання

209

методу природного злиття є більш обмеженим із-за викорис-тання додаткових масивів. Уже для N = 5000 його можна вико-ристовувати лише для значень елементів масиву типу byte. А при ЛГ = 15 000 і більше неможливо розмістити в пам'яті комп'ютера навіть і такі елементи.

Можна зробити загальний висновок такий: для невеликих за кількістю елементів масивів методи сортування послідовностей не поступаються за ефективністю методу швидкого сортування.

Остання група методів - методи лінійного сортування. На основі даних таблиці 19 можна констатувати факт, що сорту­вання підрахунком є дуже ефективним методом і не посту-пається наикращим наведеним вище методам. Є лише один недолік: обмеження на проміжок зміни значень елементів масиву, що сортуються. Ці обмеження повинні бути такими, щоб була можливість розмістити в пам'яті комп'ютера масив, де буде фіксуватися кількість різних елементів вхідного ма­сиву. Розміщенням у пам'яті вхідного масиву можна знехту-вати. Тестування проводилося для значень елементів типу word. Метод цифрового сортування є не менш ефективним і підтверджує цей статус за результатами тестування. Однак негативним моментом є обмеженість використання цього мето­ду з-за того, що він вимагає створення декількох додаткових масивів. Тому в таблиці, вже починаючи з N - 10 000, тестуван­ня цього методу стало неможливим.

На завершения аналізу всіх методів сортування можна зробити такі висновки:

  • наикращим методом при будь-яких значениях елементів масиву та їх кількості є метод швидкого сортування;

  • для кожного конкретного випадку значень елементів вхід-ного масиву можна застосувати й інші аналогічні за ефектив-ністю швидкому сортуванню методи: для майже впорядкова-них масивів; для масивів, значения елементів яких належать заданому проміжку, тощо;

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

Запитання для самоконтролю

  1. Як на апаратному рівні можна визначати час виконання программ?

  2. Яким є порівняльний аналіз методів прямого сортування?

  3. Яким є порівняльний аналіз покращених методів сортування?

  4. Яким є порівняльний аналіз удосконалених методів сортування?

  1. Яким є порівняльний аналіз методів сортування послідовнос-тей?

210

  1. Яким є порівняльний аналіз методів лінійного сортування?

  2. Які загальні висновки можна зробити, порівнюючи всі методи сортування масивів?

Завдання

  1. Розробити програму, яка створює масив із п елементів, упорядкованих за зростанням.

  2. Розробити програму, яка створює масив із п елементів, значения яких є випадковими.

  3. Розробити програму, яка створює масив із п елементів, упорядкованих за спаданиям.

  4. За допомогою програм, розроблених у пунктах 1-3, ство-рити відповідні масиви для 1000 < п < 10 000 та зберегти їх у файлах.

  5. Протестувати алгоритми, що реалізують прямі методи сортування, на вхідних масивах, створених у пункті 4, фік-суючи час їх виконання. Порівняти отримані результати тесту-вання.

  6. Протестувати алгоритми, що реалізують покращені ме­тоди сортування, на вхідних масивах, створених у пункті 4, фіксуючи час їх виконання. Порівняти отримані результати тесту вання.

  7. Протестувати алгоритми, що реалізують удосконалені ме­тоди сортування, на вхідних масивах, створених у пункті 4, фіксуючи час їх виконання. Порівняти отримані результати тестування.

  8. Протестувати алгоритми, що реалізують методи сортування послідовностей, на вхідних масивах, створених у пункті 4, фік-суючи час їх виконання. Порівняти отримані результати тес­тування.

  9. Протестувати алгоритми, що реалізують методи лінійного сортування, на вхідних масивах, створених у пункті 4, фік-суючи час їх виконання. Порівняти отримані результати тес­тування.

10. Зробити письмовий аналіз завдань 5-9.

211