Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 27

МІНІСТЕРСТВО

ОСВІТИ ТА НАУКИ УКРАЇНИ

Національний технічний університет України

«Київський політехнічний інститут імені Ігоря Сікорського»

Кафедра інформаційних систем та технологій

Звіт

з лабораторної роботи № 11

на тему «Алгоритми сортування. Методи сортування великих


обсягів даних.»

з дисципліни «Теорія алгоритмів»

Варіант №3

Виконали:
Поліщук Дарія
Вінницький Артем
Заскалета Богдан
Перевірив:
Дорошенко К.С.

Київ 2023
Лабораторна робота №11
Абстрактні типи даних
Мета роботи: Дослідження та порівняння алгоритмів
сортування.
Завдання: Головнокомандувач армії вирішив провести ревізію
флоту. Для цього штаб повинен скласти впорядкований за
кількістю матросів список кораблів кожної армади та всього
флоту. І з’ясувалося, що флот є великим. Альянс сусідніх держав
теж вирішив провести ревізію, і під час складання
впорядкованого списку виявилося багато суден з однаковою
кількістю матросів. Допоможіть скласти штабам відповідні
списки

Постановка задачі
Умова нашої задачі потребувала реалізації заповнення та
сортування списків кораблів. Для сортування мали використати
методи бульбашкового сортування і швидкого сортування. Ці
методи потрібно застосувати для сортування різних видів даних:
хаотичних, частково впорядкованих та з багатьма повторами. Для
кожного з типів даних треба було провести порівняння
ефективності цих двох алгоритмів, побудувати відповідні
графіки.

Побудова моделі
Створена програма здійснює сортування кораблів та відображає
час роботи заданих умовою методів сортування в залежності від
типів даних та кількості даних. Після закінчення сортування та
оцінки використаного часу програма повертає відсортований
масив.
Основні та Тип змінної Призначення
допоміжні змінні

list list Список елементів,


який буде
сортуватися

q int Випадковий
(головний) елемент
в списку

left list Список елементів


менші за q

middle list Список елементів


дорівнюють q

right list Список елементів


більше за q

elem int Елемент списку

mid list Середина масиву

left_list list Ліва частина


масиву

right_list list Права частина


масиву

sorted_list list Відсортований


масив

i int Індекс елементу


лівого списку

j int Індекс елементу


правого списку
Розробка алгоритму

Сортування злиттям

Параметри MergeSort - масив, початкова та кінцева позиції

Плавне сортування
Швидке сортування
Найкращий+середній випадки - O(n*log n), найгірший - O(n^2)

Аналіз складності алгоритму


Сортування злиттям

На кожному рівні рекурсії алгоритм розбиває вхідний масив


пополам, що вимагає O(log n) рекурсивних викликів. Потім на
кожному рівні відбувається операція злиття двох відсортованих
підмасивів, що займає O(n) часу. Отже, загальна складність
алгоритму злиттям складається з O(log n) рівнів рекурсії, кожен з
яких потребує O(n) операцій злиття, під час яких виконується
O(n) затрати пам’яті (на створення тимчасового масиву). З цими
розрахунками отримуємо загальну складність O(n log n).

Плавне сортування
Як і пірамідальне сортування, плавне сортування в найгіршому
випадку має швидкодію О(n log n). Перевагою плавного
сортування є те, що його швидкодія наближається до O(n), якщо
вхідні дані частково відсортовано, в той час як швидкодія
пірамідального сортування є незмінною та не залежить від стану
вхідних даних.

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

Найкращий і середній випадки для алгоритму сортування


бульбашкою матимуть складності O(n*log n). В найкращому
випадку на першій ітерації алгоритму вихідний масив
розділиться на дві підзадачі, розмір яких не буде перевищувати
n/2. З часу роботи, що описується нерівністю T(n) <= 2T(n/2) +
O(n), звідки O(n*log n) - асимптотично найкращий час.

Математичне очікування часу роботи алгоритму на всіх


можливих вхідних масивах є O(n*log n), тобто середній випадок
ближчий до найкращого.

Найгірший випадок для алгоритму швидкого сортування є


розбиття, що породжує одну підзадачу розміром n-1 і другу
розміром 0. Для кожного такого розбиття складністю O(n)
загальна складність становитиме O(n^2).

Скріншоти роботи програми для вирішення


поставленої задачі
рис.1 запуску програми
рис.2 введення некоректних даних в поле
введення( букв)
рис.3 введення некоректних даних в поле
введення( від'ємне число)
рис.4 введення некоректних даних в поле введення
(дробове число)
рис.5 введення коректних даних в поле введення та
натискання кнопки Sort
рис. 6 Видалення елемента

рис.7 Натискання кнопки видалення без вибору


елемента

Таблиця тестування програми

Кнопка Умова дій Результат Вивід Мета


натиску тестування

Sort введення Відомий На екран Перевірка на


некоректних виводиться: коректність
“Invalid роботи
даних в поле input,please, програми , а
введення try again!” саме на
(латинських exception
символів)

Sort введення Відомий На екран Перевірка на


некоректних виводиться: коректність
даних в поле “Invalid роботи
input,please, програми , а
введення( від'ємн
try again!” саме на
е число) exception

Sort введення Відомий На екран Перевірка на


некоректних виводиться: коректність
даних в поле “Invalid роботи
input,please, програми , а
введення
try again!” саме на
(дробове число) exception

Sort введення Відомий Програма Перевірка на


коректних даних продовжує коректність
в поле введення роботу та роботи
сортує програми , а
саме на
exception

Randomiz - - Програма Перевірка


e заповнить роботи
рандомно програми
форму

Delete вибір елемента Відомий Програма Перевірка на


продовжує коректність
роботу та роботи
видаляє програми
елемент

Delete без вибір Відомий Нічого не Перевірка на


елемента відбувається коректність
роботи
програми
Запуск - Відомий З'являється Перевірка на
програми вікно графічний
інтерфейс

Перевірка правильності програми

Згідно з умовою, програма симулює сортування списків кораблів,


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

Порівняння ефективності алгоритмів

Хаотичні дані:

QuickSort, MergeSort і SmoothSort мають прийнятну швидкодію


для хаотичних типів даних. QuickSort може бути найшвидшим у
середньому випадку, але потенційно має проблему з найгіршим
випадком. MergeSort має стабільну швидкодію, але може
потребувати додаткової пам'яті. SmoothSort також має ефективну
швидкодію, але в найгіршому випадку може бути трохи
повільнішим за інші два алгоритми.

Частково відсортовані дані:

При частково впорядковані дані можуть змінити ефективність


алгоритмів сортування. QuickSort може бути швидшим для таких
типів даних, оскільки він може швидко "пристроюватись" до
порядку. MergeSort буде зберігати стабільність сортування,
незалежно від рівня впорядкування. SmoothSort, хоча в цьому
випадку немає явних переваг, все одно може показати гарну
швидкодію в середньому випадку. Загалом, вибір між цими
алгоритмами також залежить від конкретних вимог і обмежень
вашої задачі. Якщо стабільність та впорядкованість важливі,
MergeSort може бути найкращим вибором. Якщо швидкодія
пріоритетна і впорядкованість не є критичною, QuickSort або
SmoothSort можуть бути кращими варіантами.

Дані з багатьма повторами:

Загалом, MergeSort та SmoothSort можуть бути кращими


варіантами для наборів даних з частими повтореннями, оскільки
вони зберігають стабільність сортування та мають гарну
швидкодію незалежно від розподілу значень. QuickSort може
мати проблеми з найгіршим випадком з часовою складністю
O(n^2) в присутності частих повторень, але все ж може бути
ефективним для розподілу значень без великої кількості
повторів.

Результати досліджень у вигляді графіка


Висновок

Під час виконання даної лабораторної роботи для сортування


великих обсягів даних було застосовано наступні алгоритми
сортування: сортування злиттям, плавне і швидке. Для цього
ознайомилися з принципом роботи даних алгоритмів. Було
здійснено сортування трьох типів даних: хаотичних, частково
впорядкованих та з багатьма повторами. На основі отриманих
даних порівняли ці алгоритми та зробили висновки про загальну
ефективність алгоритмів та про ефективність залежно від вхідних
даних.

Контрольні питання
1.Перерахуйте та прокоментуйте переваги та недоліки
швидкого сортування.
Швидке сортування (QuickSort) є одним з найпоширеніших
алгоритмів сортування. Ось переваги та недоліки швидкого
сортування:
Переваги:
- Швидкість: Швидке сортування - один з найшвидших
алгоритмів сортування в середньому. Його часова складність
O(n*logn), що робить його ефективним для обробки великих
об'ємів даних.
- Рекурсивний алгоритм: Швидке сортування реалізовано як
рекурсивний алгоритм, що дозволяє легко розуміти та
реалізовувати.
- Легко змінити: Швидке сортування дуже легко змінювати та
адаптувати для різних типів даних та вимог.
- Ін-Place: Швидке сортування виконується на місці (in-place),
тобто він не потребує додаткової пам'яті для зберігання даних.

Недоліки:
- Не стабільний: Швидке сортування не є стабільним алгоритмом,
що означає, що порядок елементів з однаковим значенням може
бути змінений.
- Не ефективний в найгіршому випадку: Найгірший випадок для
швидкого сортування відбувається тоді, коли вхідний масив вже
відсортований або майже відсортований. У такому випадку,
часова складність може бути O(n^2), що робить його менш
ефективним, ніж інші алгоритми сортування.
- Вимагає стека: Швидке сортування використовує рекурсію, що
може призвести до переповнення стека, якщо оброблюється дуже
великий масив.
- Недостатньо безпечний: Якщо програміст не виконує перевірок
на вхідні дані, то це може привести до помилок виконання, таких
як вихід за межі масиву.
Загалом, швидке сортування є ефективним та швидким
алгоритмом сортування, що добре підходить для багатьох
застосувань. Однак, він має деякі недоліки, такі як нестабільність
та неефективність в найгіршому випадку, які необхідно
враховувати при виборі алгоритму сортування для конкретної
задачі.

2.Перерахуйте та прокоментуйте переваги та недоліки


сортування злиттям. Які найпоширеніші модифікації цього
методу сортування?
Сортування злиттям (MergeSort) - це алгоритм сортування, який
працює за допомогою рекурсії і злиття відсортованих підмасивів
в один відсортований масив. Ось переваги та недоліки цього
методу сортування:

Переваги:
- Стабільність: Сортування злиттям є стабільним алгоритмом
сортування, що означає, що порядок елементів з однаковим
значенням не змінюється під час сортування.
- Ефективність: Сортування злиттям має часову складність
O(nlogn), що робить його ефективним для сортування великих
масивів даних.
- Легкість реалізації: Сортування злиттям є легким для реалізації
та розуміння, що робить його популярним серед програмістів.

Недоліки:
- Вимагає додаткової пам'яті: Сортування злиттям потребує
додаткової пам'яті для зберігання тимчасових даних під час
злиття підмасивів. Це може бути проблемою для дуже великих
масивів даних.
- Не ін-плейс сортування: Сортування злиттям не є ін-плейс
сортуванням, тобто воно не може сортувати дані на місці, а
потребує додаткової пам'яті для зберігання відсортованого
масиву.
- Спеціальні випадки: Сортування злиттям може вимагати
спеціальної обробки для випадків, коли масив містить велику
кількість повторюваних значень або відсортований майже
повністю.

Найпоширеніші модифікації сортування злиттям включають:


- Bottom-up MergeSort: Використовує ітеративний підхід для
злиття під масивів, що зменшує вимоги до пам'яті та забезпечує
кращу локальність даних.
- Natural Merge Sort: Автоматично визначає відсортовані
підмасиви у вхідному масиві та зливає їх безпосередньо, що
покращує швидкість сортування для певних типів вхідних даних.
- In-Place Merge Sort: Використовується для сортування даних на
місці, тобто не потребує додаткової пам'яті для зберігання
тимчасових даних. Це досягається за допомогою використанням
"буферів" пам'яті в межах самого масиву для зберігання
тимчасових даних під час злиття під масивів.
- Hybrid MergeSort: Поєднує сортування злиттям з іншими
алгоритмами сортування, такими як вставками, щоб покращити
час сортування для масивів малих розмірів.

У кожної з модифікацій є свої переваги та недоліки, і вибір


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

3.Перерахуйте та прокоментуйте переваги та недоліки


пірамідального сортування.

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


пірамідкою або сортування купою) є ефективним алгоритмом
сортування, який має свої переваги і недоліки. Ось деякі з них:

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


1. Ефективність у сортуванні: Пірамідальне сортування має
часову складність O(n log n), де n - кількість елементів, що
сортуються. Це робить його ефективним для великих наборів
даних.
2. Нестабільність: Пірамідальне сортування є стабільним, тобто
воно зберігає порядок рівних елементів. Це важливо у випадках,
коли потрібно відсортувати дані за кількома критеріями
одночасно.
3. Інтерактивний підхід: Іншою перевагою пірамідального
сортування є його можливість працювати з даними поетапно, що
дозволяє здійснювати сортування під час потокового вводу або в
обмеженому обсязі пам'яті.

Недоліки пірамідального сортування:


1. Нестабільність: Хоча нестабільність може бути перевагою для
деяких випадків, вона також може бути недоліком, якщо
потрібно зберегти порядок рівних елементів.
2. Висока константа: Пірамідальне сортування має високу
константу. Це означає, що на практиці воно може працювати
повільніше, ніж інші алгоритми сортування, такі як швидке
сортування або злиття.
3. Єдине використання: Пірамідальне сортування
використовується переважно для сортування, і воно не надає
таких додаткових можливостей, як інші алгоритми, наприклад,
пошук або вставка відсортованих елементів.
4. Поганий кеш-доступ: Пірамідальне сортування не є локальною
операцією, що може призводити до поганого використання кешу.
Оскільки доступ до елементів піраміди не є послідовним, це
може збільшити час виконання через промахи кешу.
У кожного алгоритму сортування є свої переваги і недоліки, і
вибір алгоритму залежить від конкретних вимог і характеристик
задачі. Пірамідальне сортування є швидким та ефективним,
особливо для великих наборів даних, але його константа та
обмежені можливості можуть бути недоліками у деяких
випадках.

4.Перерахуйте та прокоментуйте переваги та недоліки


плавного сортування.
Плавне сортування (також відоме як сортування злиттям) є
алгоритмом сортування, який має свої переваги і недоліки. Ось
деякі з них:

Переваги плавного сортування:


1. Стабільність: Плавне сортування є стабільним алгоритмом, що
означає, що воно зберігає порядок рівних елементів. Це важливо
в багатьох випадках, коли потрібно сортувати дані за кількома
критеріями одночасно.
2. Гарантована складність: Часова складність плавного
сортування становить O(n log n), де n - кількість елементів. Це
робить його ефективним для великих наборів даних і дає
гарантію швидкого виконання навіть у найгіршому випадку.
3. Гнучкість: Плавне сортування може бути легко адаптоване для
сортування різних типів даних та структур даних. Воно може
бути застосовано до масивів, зв'язаних списків, файлів та інших
джерел даних.
4. Низька вимога до пам'яті: У багатьох реалізаціях плавного
сортування не потрібна додаткова пам'ять для сортування. Це
особливо важливо при роботі з обмеженими ресурсами або в
ситуаціях, коли немає вільної пам'яті для створення додаткових
структур даних.

Недоліки плавного сортування:


1. Висока константа: Плавне сортування має велику константу в
порівнянні з деякими іншими алгоритмами сортування, такими
як швидке сортування або сортування вставками. Це означає, що
на практиці воно може бути повільнішим за інші алгоритми для
невеликих наборів даних.
2. Вимога до додаткової пам'яті: У деяких реалізаціях плавного
сортування потрібна додаткова пам'ять для збереження
проміжних результатів сортування. Це може створювати
проблеми, особливо коли пам'ять обмежена або коли розмір
вхідних даних дуже великий.
3. Не підходить для великих наборів даних з обмеженою
пам'яттю: Якщо розмір вхідних даних надто великий для
зберігання у пам'яті, то плавне сортування може бути
неефективним або навіть неможливим у практичних умовах.
Узагальнюючи, плавне сортування є ефективним, стабільним та
гнучким алгоритмом сортування, який підходить для багатьох
випадків. Однак, він має деякі обмеження, такі як вимога до
додаткової пам'яті та велика константа, які слід враховувати при
виборі алгоритму для конкретної задачі.
5.Зробіть порівняльну характеристику швидкого сортування та
сортування злиттям.
Порівняльна характеристика швидкого сортування та
сортування злиттям:
1. Часова складність:
- Швидке сортування: Часова складність в середньому та
кращому випадку складає O(n log n), але в найгіршому випадку
може сягати O(n^2).
- Сортування злиттям: Часова складність становить O(n log n)
незалежно від розподілу вхідних даних. Воно гарантує ефективну
роботу навіть у найгіршому випадку.

2. Стабільність:
- Швидке сортування: Залежно від реалізації, може бути як
стабільним, так і нестабільним. Деякі реалізації можуть зберігати
порядок рівних елементів, але інші - ні.
- Сортування злиттям: Це стабільний алгоритм сортування,
який зберігає порядок рівних елементів.

3. Вимога до додаткової пам'яті:


- Швидке сортування: Залежно від реалізації, може вимагати
O(log n) додаткової пам'яті для стеку рекурсії.
- Сортування злиттям: Зазвичай потребує додаткової пам'яті
розміром O(n) для збереження проміжних результатів злиття.

4. Ефективність для великих наборів даних:


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

великих наборів даних або випадків, коли вхідні дані не вже


майже відсортовані.

5. Рекурсивний підхід:
- Швидке сортування: Швидке сортування використовує
рекурсивний підхід, що може викликати перевищення обмеження
стеку для великих наборів даних.
- Сортування злиттям: Сортування злиттям використовує
рекурсивний підхід, але його глибина рекурсії зазвичай обмежена
до O(log n), що робить його безпечнішим для великих наборів
даних.

Вибір між швидким сортуванням та сортуванням злиттям


залежить від конкретних вимог і характеристик задачі. Швидке
сортування може бути швидшим для невеликих наборів даних та
має меншу вимогу до пам'яті, але може бути некерованим у
найгірших випадках та не гарантує стабільності сортування.
Сортування злиттям є стабільним, ефективним для великих
наборів даних та має сталу швидкість у всіх випадках, але
вимагає додаткової пам'яті для збереження проміжних
результатів злиття.

6. Зробіть порівняльну характеристику пірамідального та


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

1. Часова складність:
- Пірамідальне сортування: Часова складність становить O(n log
n) у всіх випадках, де n - кількість елементів. Воно гарантує
ефективну роботу незалежно від властивостей вхідних даних.
- Сортування злиттям: Часова складність також складає O(n log
n) у всіх випадках. Воно також гарантує ефективну роботу
незалежно від властивостей вхідних даних.

2. Стабільність:
- Пірамідальне сортування: В основному не є стабільним,
оскільки порядок рівних елементів під час сортування може бути
зміненим.
- Сортування злиттям: Сортування злиттям є стабільним
алгоритмом, який зберігає порядок рівних елементів.

3. Вимога до додаткової пам'яті:


- Пірамідальне сортування: Потребує додаткової пам'яті
розміром O(1), тобто його можна виконати на місці без створення
додаткових структур даних.
- Сортування злиттям: Вимагає додаткової пам'яті розміром
O(n) для збереження проміжних результатів злиття.

4. Поганий кеш-доступ:
- Пірамідальне сортування: Може мати поганий кеш-доступ
через несистематичний доступ до елементів піраміди.
- Сортування злиттям: Отже, сортування злиттям має кращий
кеш-доступ, оскільки елементи зчитуються послідовно.

5. Гнучкість:
- Пірамідальне сортування: Застосовується до масивів та інших
джерел даних і не потребує додаткового простору для

збереження проміжних результатів.


- Сортування злиттям: Застосовується до масивів та структур
даних з доступом до пам'яті та потребує додаткової пам'яті для
збереження проміжних результатів.
Обидва алгоритми є ефективними і широко використовуються
для сортування. Пірамідальне сортування має перевагу у
використанні меншої пам'яті, а сортування злиттям - у
стабільності та кращому кеш-доступі. Вибір між ними залежить
від конкретних вимог до часу виконання, пам'яті та стабільності,
а також від властивостей вхідних даних.

You might also like