GrozI_Course_Work
.pdf20
Для кожного алгоритму , для кожної розмірності даних було проведено по 10 сортувань і взято середній час. Час замірявся за допомогою функції
high_resolution_clock з бібліотеки chrono.
Для запуску програмної реалізації тестування необхідно зробити наступне: 1. Після відкриття проекту , відкрити файл main.cpp
(main.cpp виглядає наступним чином)
2.Ввести ім’я алгоритму сортування ,яке буде відображатися при виконанні програми в змінній name.
2.Ввести ім’я функції , яка викликає потрібний алгоритм сортування варгуменах функції tester. (ім’я всіх функції можна подивитись в файлі – sort_algorithms.h)
2.Скомпілювати та запустити програму.
3.Очікуваний результат виконання програми
21
(Очікуваний результат виконання програми)
22
Тестування
Після тестування всіх алгоритмів було виявлено декілька залежностей деяких тестових даних та алгоритмів повя’язаних з принципами роботи цих алгоритмів. Спершу розглянемо графіки всіх тестів:
1.1. Довільні дані ,I-група
|
|
|
Random data |
(I-group) |
|
|
0.35 |
|
|
|
|
|
0.3 |
|
|
|
|
|
0.25 |
|
|
|
|
(seconds) |
0.2 |
|
|
|
|
0.15 |
|
|
|
|
|
Time |
0.1 |
|
|
|
|
|
|
|
|
|
|
|
0.05 |
|
|
|
|
|
0 |
|
|
|
|
|
10 |
100 |
1000 |
10000 |
100000 |
N-elements (array size)
Selection sort Insertion sort Shaker sort Counting sort
Time (seconds)
|
|
|
|
Random data |
(I-group) |
|
|
|
||||
0.35000000 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0.30000000 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0.25000000 |
|
|
|
|
|
|
|
|
|
|
|
Selection sort |
|
|
|
|
|
|
|
|
|
|
|
||
0.20000000 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Insertion sort |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0.15000000 |
|
|
|
|
|
|
|
|
|
|
|
Shaker sort |
|
|
|
|
|
|
|
|
|
|
|
||
0.10000000 |
|
|
|
|
|
|
|
|
|
|
|
Counting sort |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0.05000000 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0.00000000 |
|
|
|
|
|
|
|
|
|
|
|
|
10 |
100 |
1000 |
10000 |
100000 |
|
N-elements (array size)
23 Можемо побачити, що insertion sort найшвидший з представлених алгоритмів, (не враховуючи counting sort) для довільних даних. Selection, Insertion, Shaker sorts - алгоритми з квадратичною складнітю. Відповідно, особливих результатів ми не побачимо. Із зростанням кількості даних швидкість квадатично зменшується.
1.2. Довільні дані ,II-група |
|
|
|
|
|
|
|
Random data |
(II-group) |
|
|
0.45 |
|
|
|
|
|
0.4 |
|
|
|
|
|
0.35 |
|
|
|
|
|
0.3 |
|
|
|
|
|
0.25 |
|
|
|
|
|
0.2 |
|
|
|
|
|
0.15 |
|
|
|
|
|
0.1 |
|
|
|
|
|
0.05 |
|
|
|
|
|
0 |
|
|
|
|
|
10 |
100 |
1000 |
10000 |
100000 |
1000000 |
24
Quick sort
Counting sort
Merge sort
Heap sort
Random data (II-group)
0.45000000 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0.40000000 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0.35000000 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0.30000000 |
|
|
|
|
|
|
|
|
|
|
|
|
Quick sort |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0.25000000 |
|
|
|
|
|
|
|
|
|
|
|
|
Counting sort |
|
|
|
|
|
|
|
|
|
|
|
|
Merge sort |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0.20000000 |
|
|
|
|
|
|
|
|
|
|
|
|
Heap sort |
|
|
|
|
|
|
|
|
|
|
|
|
||
0.15000000 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0.10000000 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0.05000000 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0.00000000 |
|
|
|
|
|
|
|
|
|
|
|
|
|
10 |
100 |
1000 |
10000 |
100000 |
1000000 |
|
25
В другу групу входять Quick, Counting, Merge, Heap sorts. Heap sort показав гірші результати ніж інші алгоритми групи. Quick sort в свою чергу швидкий та стабільний алгоритм . Counting sort працює за лінійний час, майже незалежно від кількості даних він юуде працювати майже однаково. Це погано якщо на сортування подається мало даних, але як можна побачити на графіку ,всже післе 100000 елементів Counting sort показує гарну швидкість яка буда доречна при великих об’ємах даних.
2.1. Реверсивно відсортовані дані, I-група
|
|
|
Reversed data |
(I-group) |
|
|
50 |
|
|
|
|
|
45 |
|
|
|
|
|
40 |
|
|
|
|
(seconds) |
35 |
|
|
|
|
30 |
|
|
|
|
|
25 |
|
|
|
|
|
20 |
|
|
|
|
|
Time |
|
|
|
|
|
15 |
|
|
|
|
|
|
10 |
|
|
|
|
|
5 |
|
|
|
|
|
0 |
|
|
|
|
|
10 |
100 |
1000 |
10000 |
100000 |
N-elements (array size)
Selection sort Insertion sort Shaker sort Counting sort
Time (seconds)
Reversed data (I-group)
50
45
40
35
30
25
20
15
10
5
0
10 |
100 |
1000 |
10000 |
100000 |
Selection sort
Insertion sort
Shaker sort Counting sort
N-elements (array size)
Можему бачити таку саму картину. |
|
|
|
||
2.2. Реверсивно відсортовані дані, II-група |
|
|
|||
|
|
Reversed data |
(II-group) |
|
|
0.4 |
|
|
|
|
|
0.35 |
|
|
|
|
|
0.3 |
|
|
|
|
|
0.25 |
|
|
|
|
|
0.2 |
|
|
|
|
|
0.15 |
|
|
|
|
|
0.1 |
|
|
|
|
|
0.05 |
|
|
|
|
|
0 |
|
|
|
|
|
10 |
100 |
1000 |
10000 |
100000 |
1000000 |
26
Quick sort
Counting sort
Merge sort
Heap sort
|
Reversed data |
(II-group) |
|
0.4 |
|
|
|
|
|
|
|
0.35 |
|
|
|
|
|
|
|
0.3 |
|
|
Quick sort |
|
|
||
0.25 |
|
|
|
|
|
Counting sort |
|
|
|
|
|
0.2 |
|
|
Merge sort |
|
|
||
|
|
|
Heap sort |
0.15
0.1
0.05
0
10 |
100 |
1000 |
10000 |
100000 |
1000000 |
Майже ніякої різниці.
3.1. Частково відсортовані дані, I-група
Half-sorted data (I-group)
|
0.35 |
|
|
|
|
|
|
|
0.3 |
|
|
|
|
|
|
|
0.25 |
|
|
|
|
|
|
(seconds) |
0.2 |
|
|
|
|
|
|
0.15 |
|
|
|
|
|
|
|
Time |
0.1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0.05 |
|
|
|
|
|
|
|
0 |
|
|
|
|
|
|
|
0 |
20000 |
40000 |
60000 |
80000 |
100000 |
120000 |
N-elements (array size)
27
Selection sort
Shaker sort
Counting sort
Time (seconds)
Half-sorted data (I-group)
0.35
0.3
0.25
0.2
0.15
0.1
0.05
0
10 |
100 |
1000 |
10000 |
100000 |
Selection sort
Insertion sort
Shaker sort Counting sort
N-elements (array size)
28
На частково відсортованих даних для даних сортувань можемо бачити схожі результати, але шейкерне сортування сповільнилось, а сортування вставками на його фоні трохи збільшило швидкість сортування. Досить зрозуміла повеінка. 3.2. Частково відсортовані дані, II-група
Half-sorted data (II-group)
0.4 |
|
|
|
|
|
0.35 |
|
|
|
|
|
0.3 |
|
|
|
|
|
0.25 |
|
|
|
|
|
0.2 |
|
|
|
|
|
0.15 |
|
|
|
|
|
0.1 |
|
|
|
|
|
0.05 |
|
|
|
|
|
0 |
|
|
|
|
|
10 |
100 |
1000 |
10000 |
100000 |
1000000 |
Quick sort Counting sort Merge sort Heap sort
|
|
|
|
|
|
Half-sorted data |
(II-group) |
|
|
|
||||
0.4 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0.35 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0.3 |
|
|
|
|
|
|
|
|
|
|
|
|
|
Quick sort |
|
|
|
|
|
|
|
|
|
|
|
|
|
||
0.25 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Counting sort |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0.2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
Merge sort |
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Heap sort |
0.15 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0.1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0.05 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10 |
100 |
1000 |
10000 |
100000 |
1000000 |
|
Нічого незвичайного
4.1. Відсортовані дані, I-група
Sorted data (I-group)
|
0.25 |
|
|
|
|
|
|
|
0.2 |
|
|
|
|
|
|
(seconds) |
0.15 |
|
|
|
|
|
|
0.1 |
|
|
|
|
|
|
|
Time |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0.05 |
|
|
|
|
|
|
|
0 |
|
|
|
|
|
|
|
0 |
20000 |
40000 |
60000 |
80000 |
100000 |
120000 |
N-elements (array size)
29
Selection sort
Shaker sort
Counting sort
Time (seconds)
Sorted data (I-group)
0.25
0.2
0.15
0.1
0.05
0
10 |
100 |
1000 |
10000 |
100000 |
Selection sort Series1
Shaker sort Counting sort
N-elements (array size)