Головна Алгоритми та AI Алгоритми Сортування — Візуалізація та Звук

📊 Алгоритми Сортування — Візуалізація та Звук

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

Алгоритми та AI2DЛегкий60 FPS
sorting ↗ Відкрити окремо
DRAG · SCROLL · CLICK — керуйте прямо у вікні симуляції.

Схожі симуляції

Про симуляцію

Ця симуляція анімує дванадцять класичних алгоритмів сортування у вигляді ряду вертикальних стовпців, висота яких відображає значення, що впорядковуються. Поки кожен алгоритм працює, стовпці, які порівнюють, міняють місцями, перезаписують або позначають як опорний елемент, підсвічуються різними кольорами, а осцилятор Web Audio відображає висоту кожного стовпця на тон від 120 Гц до 1600 Гц — тож можна буквально почути, як масив стає впорядкованим. Лічильники в реальному часі відстежують порівняння, обміни, звернення до масиву та витрачений час, дозволяючи виміряти реальну вартість кожного методу.

Сортування — одна з найбільш вивчених задач у інформатиці, оскільки майже кожна більша програма покладається на впорядковані дані — для бінарного пошуку, усунення дублікатів, індексування баз даних, рендерингу та іншого. Показані алгоритми охоплюють основні родини підходів: прості квадратичні методи (бульбашкове, сортування вставками, вибором), методи розділяй-і-володарюй (злиттям, швидке), сортування на основі купи (пірамідальне) та непорівняльні цілочисельні сортування (підрахунком, порозрядне). Фундаментальний результат 1972 року довів, що жодне порівняльне сортування не може перевершити O(n log n) порівнянь у середньому, і саме тому сортування злиттям, швидке та пірамідальне домінують у бібліотеках загального призначення.

Поширені запитання

Що означають кольори стовпців?

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

Чому я можу чути сортування?

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

Який алгоритм найшвидший?

Для випадкових даних швидке сортування, сортування злиттям і пірамідальне сортування (усі в середньому O(n log n)) значно швидші за квадратичні методи, як-от бульбашкове чи сортування вибором. Для цілочисельних ключів у невеликому діапазоні непорівняльні сортування (підрахунком за O(n+k), порозрядне за O(nk)) можуть бути ще швидшими, оскільки вони обходять нижню межу порівняльного сортування O(n log n).

Чому швидке сортування іноді повільне?

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

Чим сортування злиттям відрізняється від швидкого сортування?

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

Як підрахункове та порозрядне сортування можуть перевершити O(n log n)?

Вони не є порівняльними. Підрахункове сортування підраховує, скільки разів зустрічається кожне значення, і відновлює масив безпосередньо, працюючи за O(n+k), де k — діапазон значень. Порозрядне сортування обробляє числа розряд за розрядом, використовуючи стабільний прохід кошиками. Оскільки вони ніколи не порівнюють два елементи один з одним, нижня межа порівняння до них не застосовується.

Що таке стабільне сортування і чому це важливо?

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

Навіщо включати "повільні" алгоритми, як-от бульбашкове сортування?

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

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

Так. На дуже малих масивах накладні витрати хитромудрих алгоритмів можуть зробити прості методи, як-от сортування вставками, конкурентоспроможними — саме тому багато реальних бібліотек переходять на сортування вставками нижче певного порогу. У міру зростання масиву методи O(n log n) вирвуться вперед, і розрив стрімко збільшується.

Чи це ті самі алгоритми, що використовують у реальному програмному забезпеченні?

Так, основні ідеї ідентичні. Більшість стандартних бібліотек мов використовують гібридні сортування — наприклад, Timsort (гібрид злиття та вставок) у Python і сортуванні об'єктів Java, та introsort (швидке сортування, що переходить на пірамідальне) у C++. Цей візуалізатор показує підручникові будівельні блоки, з яких складені ці виробничі сортування.