You are on page 1of 7

Поняття сортування. Елементарні методи сортування.

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

Загальне значення слова «сортування» — це розподіл елементів на групи за деякою


ознакою, наприклад, розподіл яблук по сортах за їх якістю, листів за поштовими індексами,
банок із фарбами за кольором тощо. Проте у програмуванні під сортуванням розуміють
упорядкування елементів (за деякою характеристикою), наприклад, вишикування учнів за
зростом на уроці фізкультури, розташування слів у словнику в алфавітному порядку,
упорядкування точок площини за зростанням координати х тощо.
Алгори́ тм сортува́ ння — в інформатиці — процес, що впорядковує множину
однотипних елементів за певною ознакою (ключем сортування). Сортування є типовою
проблемою обробки даних, що забезпечує розміщення елементів невпорядкованого набору
значень в порядку монотонного зростання або спадання значення ключа.
Потреба у створенні швидких та ефективних алгоритмів сортування вперше виникла в
середині 20 ст. у США і була зумовлена великими обсягами інформації, яку потрібно було
впорядковувати — результатами перепису населення. Устаткування для цього запропонував
Г. Голлеріт, створивши електромеханічний пристрій для автоматичного оброблення
інформації, записаної на перфокартах, — так звану електричну табулюючу систему Голлеріта
(англ. Hollerith Electric Tabulating System). Ці перфокарти можна було сортувати відповідно
до перфорації.
Наступний етап (з початку 1940-х) пов’язаний з появою перших електронних
обчислювальних машин (ЕОМ) та позначається потребою у зменшенні часу сортування
великих масивів даних. Першою програмою для обчислювальних машин стала саме
програма сортування. У 1945 Дж. фон Нейманн (США) для тестування набору команд одного
з перших електронних комп’ютерів EDVAC (скор. від англ. Electronic Discrete Variable
Automatic Computer) розробив програми сортування методом злиття. У 1946 опублікована
перша стаття про алгоритми сортування одного з розробників першого програмованого
комп’ютера ENIAC (скор. від англ. Electronic Numerical Integrator and Computer) Дж.В.Моклі
«Про сортування та злиття». Перехід до сортування даних за допомогою ЕОМ викликав
поділ сортування на зовнішнє (обробка даних з периферійних пристроїв) і внутрішнє
(обробка даних із внутрішньої пам’яті ЕОМ).
До середини 1950-х найпоширенішими були модифікації сортування злиттям і
вставками; надалі розвиток ЕОМ другого покоління став передумовою до появи перших мов
програмування високого рівня (Фортран, Алгол, Кобол), придатних для реалізації
різноманітних алгоритмів, і значно ширшого застосування комп’ютерів у результаті
зменшення їх габаритів і вартості. У цей час були розроблені такі алгоритми: швидке
сортування (англ. Quick Sort) — Ч. Е. Хоар (Велика Британія), сортування з регресним кроком
(англ. Hell Sort) — Д. Л. Шелл (США), пірамідальне сортування (англ. Heap Sort) — Дж. В.
Вільямс (Велика Британія) тощо. Ці алгоритми широко використовуються й донині.
Інтенсивного розвитку теорія сортування зазнала наприкінці 1960-х. Алгоритми, що
з’явилися пізніше, багато в чому були варіаціями вже відомих методів. Набули поширення
адаптивні методи сортування, орієнтовані на швидше виконання у випадках, коли вхідна
послідовність відповідає заздалегідь визначеним критеріям. Результати цього етапу розвитку
алгоритмів сортування відображено в фундаментальній монографії «Мистецтво
програмування» (англ. «The Art of Computer Programming») Д. Е. Кнута (1973, США).
До початку 1970-х були поширені такі алгоритми: сортування за допомогою підрахунку;
сортування шляхом вставок; обмінне сортування; сортування за допомогою вибору;
сортування методом злиття; сортування методом розподілу. Період із середини 1970-х до
1990-х відзначився досягненнями значних успіхів у збільшенні швидкості сортування за
рахунок підвищення ефективності існуючих алгоритмів шляхом їхньої доробки чи
комбінування. Наприклад, Е. В. Дейкстра (Нідерланди) у 1981 запропонував алгоритм
плавного сортування (англ. Smooth Sort), що є розвитком пірамідального сортування.
Основні характеристики
 час, необхідний на впорядкування множини з n елементів;
 обсяг оперативної пам’яті для виконання сортування;
 стабільність: чи змінює сортування взаємне розташування елементів із однаковими
ключами.

Часова складність алгоритмів сортування різниться від O(n ) до O(n2).


Приклади алгоритмів сортування з часовою складністю O(n 2): сортування вставкою
(англ. Insertion Sort), сортування вибором (англ. Selection Sort ), бульбашкове сортування
(англ. Bubble Sort ).
Приклади алгоритмів сортування з часовою складністю O(n log n): сортування злиттям,
швидке сортування, пірамідальне сортування. Але стабільні алгоритми сортування, що
працюють за час O(n log n), потребують O(n) додаткової пам'яті.
Приклади алгоритмів сортування з часовою складністю O(n): сортування комірками,
сортування підрахунком, сортування за розрядами. Такі алгоритми потребують використання
додаткової інформації про елементи.
На практиці елементи множини, що впорядковуються, містять не тільки ключ
сортування, але й іншу інформацію. Обсяг цієї інформації може бути значно більшим за
обсяг самого ключа (наприклад, ключ — ім’я файлу, а супутня інформація — вміст цього
файлу). Тому важливо, щоб впорядкування відбувалось не у самому масиві елементів, а в
масиві ключів, що є вказівниками на інші дані.
Сортування вставками — елементи вхідної послідовності проглядаються по одному, і
кожен новий елемент, що надійшов, розміщується в придатне місце серед раніше
упорядкованих елементів. Застосовується для майже цілком відсортованих даних та даних
невеликого розміру. Часова складність — O(n2).

Бульбашкове сортування — у вхідній послідовності порівнюються два сусідні


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

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

За час O ( n 2 )
сортування вставкою
сортування обміном
За час O ( n log n )
сортування злиттям
За час O ( n ) з використанням додаткової інформації про елементи
сортування підрахунком
сортування за розрядами
сортування комірками
За час O ( n log 2 n )
сортування злиттям модифіковане

Сортування вибором

Рисунок 1 – Сортування вибором

У чому ідея сортування вибором?


1. У невідсортованому підмасиві шукається локальний максимум.
2. Знайдений максимум змінюється місцями з останнім елементом у підмасиві.
3. Якщо в масиві залишилися невідсортовані підмасиви, дивись пункт 1.

Сортування вставками

Рисунок 2 – Сортування вставками

Загальна суть сортувань вставками така:

1. Перебираються елементи у невідсортованій частині масиву.


2. Кожен елемент вставляється в відсортовану частину масиву на те місце, де
він має бути.

Сортування вставками завжди ділять масив на 2 частини – відсортовану та


невідсортовану. З невідсортованої частини витягується будь-який елемент. Оскільки інша
частина масиву відсортована, то досить швидко можна знайти своє місце для цього
вилученого елемента. Елемент вставляється куди потрібно, у результаті відсортована частина
масиву збільшується, а невідсортована зменшується.

Найслабше місце в цьому підході – вставка елемента у відсортовану частину масиву.


Насправді це непросто і на які хитрощі не доводиться йти, щоб виконати цей крок.

Головна відмінність: у сортуванні вставками ми витягаємо з невідсортованої частини


масиву будь-який елемент і вставляємо його на своє місце у відсортованій частині. У
сортуванні вибором ми доцільно шукаємо максимальний елемент (або мінімальний), яким
доповнюємо відсортовану частину масиву.

У вставках ми шукаємо, куди вставити черговий елемент, а у виборі - ми заздалегідь вже


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

Це робить обидва класи алгоритмів зовсім відмінними один від одного за своєю суттю
та застосовуваними методами.

Сортування Шелла
Сортування Шелла було названо на честь її винахідника - Дональда Шелла, який
опублікував цей алгоритм у 1959 році.

Ідея методу Шелла полягає у порівнянні елементів, що стоять не лише поряд, а й на


певній відстані один від одного. Іншими словами, це сортування вставками з попередніми
«грубими» проходами.
У сортуванні Шелла відстань між порівнюваними елементами береться мінливим від
проходу до проходу, від більшого на першому проході, до 1 на останніх, таким чином, на цих
останніх проходах метод Шелла вироджується в примітивне сортування бульбашкою.
Розбити масив на групи елементів, що знаходяться на певній відстані один від одного, і
здійснити незалежне сортування цих груп (як правило, методом вставки). На кожній ітерації
крок між елементами групи зменшується і на останній ітерації він дорівнює одиниці.
Складність сортування залежить від способу вибору кроку.

Лістинг 1. Процедура Shell

Порозрядні сортування

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

Порозрядне сортування за молодшими розрядами :: LSD radix sort

Рухаємося від молодших розрядів до старших і на кожної ітерації розподіляємо елементи


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

Після чергового розподілу ми повертаємо елементи в основний масив у тому порядку, в


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

Для порозрядних сортувань важливо, щоб елементи розглядалися як такі, що мають


однакову кількість розрядів. Якщо фактично кількість розрядів відрізняється, то проблема
вирішується припискою додаткових нулів як старші розряди.
Порозрядне сортування за старшими розрядами :: MSD radix sort

Цей варіант складніше у реалізації, оскільки перехід до нижніх розрядів рекурсивно


здійснюється усередині класів, а не серед всіх елементів масиву.

Але ця складність винагороджується тим, що MSD працює швидше, ніж LSD. При
проході від молодших розрядів до старших доводиться обробляти всі розряди всіх чисел, щоб
коректно відсортувати.

Якщо ж рухатися від старших до молодших, то за фактом не доводиться обробляти всі


розряди всіх чисел, стан відсортований зазвичай настає раніше.
Запитання для самоконтролю
1. Поясніть алгоритм методу вставки сортування масиву.
2. У чому полягає сутність методу Шелла сортування масиву?
3. За рахунок чого досягається покращення часової складності сортування в методі
Шелла?
4. Від чого залежить часова складність сортування масиву методом Шелла?
5. Які послідовності можуть використовуватися для обчислення кроку між елементами
групи в методі Шелла?

Список використаної літератури

Рогушина Ю. В. Алгоритм сортування // Велика українська енциклопедія. URL:


https://vue.gov.ua/Алгоритм сортування (дата звернення: 24.09.2023).
Дональд Кнут. The Art of Computer Programming, Volume 3: Sorting and Searching, Third
Edition. Addison-Wesley, 1997. ISBN 0-201-89685-0. Pages 106–110 of section 5.2.2: Sorting by
Exchanging.
Томас Кормен, Чарльз Лейзерсон, Рональд Рівест, and Кліфорд Стайн. Вступ до
алгоритмів, Second Edition. MIT Press and McGraw-Hill, 2001. ISBN 0-262-03293-7. Problem 2-
2, pg.38.
Sorting in the Presence of Branch Prediction and Caches

You might also like