Пишіть код так, начебто його супроводжувати буде схильний до насильства психопат, який знає, де ви мешкаєте. Мартін Голдінг Мета роботи: Навчитися використовувати процедуру швидкого сортування для аналізу даних. ТЕОРЕТИЧНІ ВІДОМОСТІ
Рішення завдання сортування даних (sorting problem) потребує їх
перегрупування в заданому порядку. Задаємо порядок сортування – відсортувати послідовність чисел в порядку зростання. На вхід подається послідовність чисел a1, a2, …,a n. На виході отримуємо відсортовану послідовність b1, b2, …,bn в порядку b1 ≤ b2 ≤…bn. Швидке сортування – рекурсивний алгоритм сортування вхідних даних й має псевдокод [1].
На вхід подається послідовність чисел A[1..n], ключовою в швидкому сортуванні
є процедура PARTITION, що змінює порядок елементів в масиві A[p..r], без залучення додаткової пам’яті. Дії алгоритму в наступному – обирається x=A[r] в якості опорного (pivot) елемента, відносно якого масив перегруповується: зліва від pivot отримаємо підмасив A[p, q – 1], всі елементи якого менші або дорівнюють опорному, а справа – A[p, q – 1], що містить елементи значення більші pivot. Надалі до підмасивів визивається рекурсивно PARTITION. По закінченню дії Quicksort маємо відсортовану послідовність чисел. Аналіз алгоритму. Асимптотичні оцінки – O(n2); θ(nlog2n); Ω(nlog2n). Алгоритм додаткової пам’яті не потребує, перегрупування чисел відбувається в межах заданого масиву, то ж об’єм оперативної пам’яті не перевищує деяку постійну величину. ЗАВДАННЯ ЛАБОРОТОРНОЇ РОБОТИ
1. Реалізувати алгоритм швидкого сортування для вхідних даних різної кількості та
степені упорядкованості елементів в масиві. Написати програму (функцію main), що містить опис даних та алгоритм сортування. Виконати алгоритм для числа вхідних даних – n = 10, 100, 1000, 5000, 10000 елементів, згенерувавши три види різних послідовностей – випадкову, зростаючу, спадаючу. 2. Для кожного виду послідовності та кількості елементів визначити час сортування та кількість операцій присвоювань та перестановок. 3. Вивести в консоль результати досліджень. 4. Звести результати до таблиці та зробити висновки.
Рекомендації до виконання практичної роботи (необов’язкові )
Комп’ютерна реалізація може бути виконана за допомогою будь-якої мови програмування. Код програми та його виконання перевіряється викладачем та пояснюється студентом при здачі лабораторної роботи. Наприклад, студент сам обирає за допомогою чого він початково формує структуру даних – або з використанням масиву, або списку, або використовує стандарті бібліотеки. Для генерації випадкових чисел рекомендуємо використовувати функцію (при програмуванні на мові С++) #include <stdlib.h> #include <time.h> srand (час (NULL)); // Ініціалізація функції ранд значенням функції часу INT секрет = рандів ()% 1000000 + 1; // Згенерувати випадкове число від 1 до 1000000 #include <stdlib.h>
#include <time.h>
srand(time(NULL)); // ініціалізація функції rand значеннями функції time
int secret = rand() % 1000000 + 1; // згенерувати випадкове число від 1 до 1000000
Вимоги до оформлення звіту
Звіт повинен складатися з 4 частин: 1. Титульна сторінка із зазначенням номера та теми лабораторної роботи, групи, прізвища та варіанта студента. 2. Завдання лабораторної роботи. 3. Програмний код, написаний в рамках виконання завдання. 4. Скріншоти, що демонструють роботу основних складових програми. Звіт зберігається в електронному варіанті.
1. Алгоритмы: построение и анализ, 3-е издание/ Т. Кормен, Ч. Лейзерсон,Р