Мета: Ознайомитися із простими алгоритмами сортування та навчитися їх програмувати. Засвоїти базові умови тестування програм та вимірювання їх ефективності.
Хід роботи
Сортування вставками
Сортування вставками - простий алгоритм сортування на основі порівнянь. На великих масивах є значно менш ефективним за такі алгоритми, як швидке сортування, пірамідальне сортування та сортування злиттям. Однак, має цілу низку переваг:
простота у реалізації
ефективний (за звичай) на маленьких масивах
ефективний при сортуванні масивів, дані в яких вже непогано відсортовані: продуктивність рівна O (n + d), де d - кількість інверсій
на практиці ефективніший за більшість інших квадратичних алгоритмів (O (n2)), як то сортування вибором та сортування бульбашкою: його швидкодія рівна n2/4, і в найкращому випадку є лінійною є стабільним алгоритмом
Сортування злиттям - алгоритм сортування, в основі якого лежить принцип Розділяй та володарюй. В основі цього способу сортування лежить злиття двох упорядкованих ділянок масиву в одну впорядковану ділянку іншого масиву. Злиття двох упорядкованих послідовностей можна порівняти з перебудовою двох колон солдатів, вишикуваних за зростом, в одну, де вони також розташовуються за зростом. Якщо цим процесом керує офіцер, то він порівнює зріст солдатів, перших у своїх колонах і вказує, якому з них треба ставати останнім у нову колону, а кому залишатися першим у своїй. Так він вчиняє, поки одна з колон не вичерпається - тоді решта іншої колони додається до нової.
Під час сортування в дві допоміжні черги з основної поміщаються перші дві відсортовані підпослідовності, які потім зливаються в одну і результат записується в тимчасову чергу.
Потім з основної черги беруться наступні дві відсортовані підпослідовності і так до тих пір доки основна черга не стане порожньою. Після цього послідовність з тимчасової черги переміщається в основну чергу. І знову продовжується сортування злиттям двох відсортованих підпослідовностей.
Сортування триватиме до тих пір поки довжина відсортованої підпослідовності не стане рівною довжині самої послідовності.
printf ("The time was:%f s\n", (end - start) / CLK_TCK);
rez=fopen ("rezult. txt","wt");
for (int i=0; i<N; i++)
fprintf (rez,"%d\n",* (X+i));
fclose (rez);
getch ();
}Результат роботи сортування злиттям
Довжина послідовності
Випадкові
Зростає
Спадає
312
17
927
85
10009
середнє
10
Пересилання
78
78
78
78
78
78
78
78
Порівняння
22
22
22
22
22
22
22
22
50
Пересилання
568
568
568
568
568
568
568
568
Порівняння
257
257
257
257
257
257
257
257
200
Пересилання
3106
3106
3106
3106
3106
3106
3106
3106
Порівняння
818
818
818
818
818
818
818
818
1000
Пересилання
19974
19974
19974
19974
19974
19974
19974
19974
Порівняння
5049
5049
5049
5049
5049
5049
5049
5049
5000
Пересилання
123644
123644
123644
123644
123644
123644
123644
123644
Порівняння
33965
33965
33965
33965
33965
33965
33965
33965
10000
Пересилання
267262
267262
267262
267262
267262
267262
267262
267262
Порівняння
74335
74335
74335
74335
74335
74335
74335
74335
Кількість порівняннь:
Кількість пересилань:
Швидке сортування
Швидке сортування (англ. Quick Sort) - алгоритм сортування, добре відомий, як алгоритм розроблений Чарльзом Хоаром, який не потребує додаткової пам'яті і виконує у середньому O (n log (n)) операцій. Однак, у найгіршому випадку робить O (n2) порівнянь. Оскільки алгоритм використовує дуже прості цикли і операції, він працює швидше інших алгоритмів, що мають таку ж асимптотичну оцінку складності.
Ідея алгоритму полягає в переставлянні елементів масиву таким чином, щоб його можна було розділити на дві частини і кожний елемент з першої частини був не більший за будь-який елемент з другої. Впорядкування кожної з частин відбувається рекурсивно. Алгоритм швидкого сортування може бути реалізований як у масиві, так і в двозв'язному списку.
Швидке сортування є алгоритмом на основі порівнянь, і не є стабільним.
printf ("The time was:%f s\n", (end - start) / CLK_TCK);
start= clock ();
fclose (f);
getch ();
}
Результат роботи швидкого сортування
Довжина послідовності
Випадкові
Зростає
Спадає
312
17
927
85
10009
середнє
10
Пересилан-ня
31
21
35
30
35
30,4
6
21
Порівняння
16
20
11
19
13
15,8
23
15
50
Пересилан-ня
258
240
259
240
255
250,4
31
107
Порівняння
186
249
188
171
178
194,4
214
213
200
Пересилан-ня
1219
1292
1240
1227
1241
1243,8
126
428
Порівняння
1130
1357
1149
1377
1308
1264,2
1562
1433
1000
Пересилан-ня
8055
7945
8038
7997
8109
8028,8
642
2139
Порівняння
7697
7652
6906
7161
7030
7289,2
11779
9793
5000
Пересилан-ня
48603
47722
48371
48384
48839
48383,8
3167
10664
Порівняння
47782
55603
46085
48296
44447
48442,6
69909
62812
10000
Пересилан-ня
104555
103469
103598
103603
104151
103875,2
6333
263688
Порівняння
97973
106301
106409
106769
106294
104749,2
148007
140384
Кількість пересилань:
Кількість порівняннь:
Сортування купою
Сортування купою - алгоритм сортування на основі порівнянь. Він полягає у побудові купи і за її допомогою виділення наступного елемента відсортованої послідовності. Хоча, на практиці, він трохи повільніший на більшості машин, ніж швидке сортування, у нього є перевага - швидкодія у найгіршому випадку рівна (n log n). Є не стабільним алгоритмом.
Виконуючи цю роботу я ознайомився і навчився писати різні алгоритми сортування. Існує дуже багато алгоритмів сортування, кожний зі своїми перевагами, недоліками і ефективні в тому чи іншому випадку, виконання цієї роботи допомогло мені зрозуміти принципи роботи деяких з них і коли який з них слід застосовувати.