Алгоритм сортування

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

Алгоритм сортування — це алгоритм, що розв'язує задачу сортування, тобто здійснює впорядкування лінійного списку (масиву) елементів.

Термінологія

[ред. | ред. код]

Термін сортування (англ. sorting) означає розділення елементів за певними ознаками (сортами) і не дуже точно описує поставлене завдання. Точнішою була б назва впорядкування (англ. ordering), але через перевантаженість слова «порядок» (англ. order) напрочуд різними значеннями[джерело?] ним не користуються.

Постановка задачі

[ред. | ред. код]

Вхід алгоритму: послідовність з чисел

Вихід алгоритму: перестановка вхідної послідовності таким чином, що ( — перестановка послідовності чисел ).

Вхідна послідовність найчастіше представляється у вигляді n-елементного масиву, хоча може мати й інше представлення, наприклад, у вигляді зв'язного списку.

Вхідна послідовність: (5, 6, 1, 8, 5, 7, 4)
Вихідна послідовність: (1, 4, 5, 5, 6, 7, 8)

Структури даних

[ред. | ред. код]
Докладніше: Структура даних

На практиці елементи, що впорядковуються, рідко бувають просто числами. Набагато частіше кожен такий елемент є записом (англ. record). У кожному записі є ключ (англ. key), за яким, власне і здійснюється впорядкування; водночас є й інша супутня інформація. Алгоритм сортування на практиці має бути реалізований так, щоб разом із ключами переміщати і супутню інформацію. Якщо кожен запис містить супутню інформацію великого обсягу, то з метою звести до мінімуму переписування великих обсягів інформації, впорядкування відбувається не в самому масиві елементів, а в масиві вказівників на елементи.

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

Класифікація алгоритмів сортування

[ред. | ред. код]

Для алгоритму сортування (як і для будь-якого іншого сучасного алгоритму) основними характеристиками є:

  • Час, необхідний на впорядкування n-елементного масиву. Для значної кількості алгоритмів середній і найгірший час впорядкування n-елементного масиву є  — це пов'язано з тим, що в них передбачені перестановки елементів, що стоять поряд (різниця між індексами елементів не перевищує деякого заданого числа). Такі алгоритми зазвичай є стабільними, хоча і не ефективними для великих масивів. Інший клас алгоритмів здійснює впорядкування за час . В цих алгоритмах використовується можливість обміну елементів, що знаходяться на будь-якій відстані один від одного.
  • Необхідність додаткової пам'яті для сортування. Зазвичай необхідно O(1) пам'яті.
  • Стабільність (англ. Stability) — стабільне сортування не змінює взаємного розташування елементів з однаковими ключами.

Теорема про найкращий час сортування

[ред. | ред. код]

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

Доведення

[ред. | ред. код]

На кожному кроці алгоритм проводить одне порівняння, результатом якого є один з двох варіантів:

Подальші дії алгоритм робитиме залежно від результату порівняння. Отже, всю роботу алгоритму можна представити у вигляді бінарного дерева, в листах якого лежать можливі перестановки вхідного масиву.

Отже, дерево має листів, а висота дерева є . Час роботи в найгіршому випадку пропорційний висоті дерева:

.

Ці швидкі алгоритми використовуються в реальних задачах. Проте більшість із них нестабільні. Стабільні алгоритми, що працюють за час , потребують додаткової пам'яті.

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

Ще один клас алгоритмів використовує у своїй роботі деяку додаткову інформацію про елементи, що впорядковуються (наприклад, те що вони є різними числами в деякому діапазоні). Завдяки цьому вони працюють за час .

Відомі алгоритми сортування

[ред. | ред. код]

За час :

  • Сортування вибором — (англ. Selection sort) — пошук найменшого або найбільшого елемента і переміщення його в початок або кінець впорядкованого списку.
  • Сортування вставкою (включенням) — (англ. Insertion sort) — визначаємо місце, де поточний елемент повинен знаходитися в упорядкованому списку, і вставляємо його туди.
  • Сортування обміном (сортування бульбашкою, англ. Bubble sort) — для кожної пари індексів проводиться обмін, якщо елементи розташовані не по порядку.
  • Сортування методом бінарної вставки

За час :

За час з використанням додаткової інформації про елементи:

За час :

За час :

Див. також

[ред. | ред. код]

Література

[ред. | ред. код]
  • Дональд Кнут. Sorting and Searching // The Art of Computer Programming. — 3rd. — Massachusetts : Addison–Wesley, 1998. — Т. 3. — 780 с. — ISBN 0-201-89685-0.(англ.)
  • Т. Кормен; Ч. Лейзерсон; Р. Рівест; К. Стайн (2009) [1990]. Section II. Сортування і порядкові статистики. Вступ до алгоритмів (вид. 3rd). MIT Press і McGraw-Hill. ISBN 0-262-03384-4.

Посилання

[ред. | ред. код]