Чому сортування селекції швидше, ніж сортування бульбашок?


28

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

  1. Найгірша складність часу :O(n2)

  2. Кількість порівнянь : O(n2)

  3. Найкраща складність часу :

    • Сорт бульбашки:O(n)
    • Сортування вибору:O(n2)
  4. Середня складність часу :

    • Сорт бульбашки: O(n2)
    • Сортування вибору: O(n2)

Відповіді:


32

Усі складнощі, які ви надали, є правдивими, однак вони наведені в нотації Big O , тому всі додаткові значення та константи опущені.

Щоб відповісти на ваше запитання, ми повинні зосередитися на детальному аналізі цих двох алгоритмів. Цей аналіз можна зробити вручну або знайти у багатьох книгах. Я буду використовувати результати мистецтва Кнута в програмі "Комп'ютерне програмування" .

Середня кількість порівнянь:

  • Сорт бульбашки : 12(N2−Nln⁡N−(γ+ln⁡2−1)N)+O(N)
  • Сортування вставки :14(N2−N)+N−HN
  • Сортування вибору :(N+1)HN−2N

Тепер, якщо побудувати ці функції, ви отримаєте щось подібне: сюжет сюжет2

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

Цей аналіз ґрунтується на припущенні, що введення є випадковим - що може бути істинним постійно. Однак перед тим, як розпочати сортування, ми можемо випадково переставити послідовність введення (використовуючи будь-який метод), щоб отримати середній випадок.

Я опустив аналіз складності часу, оскільки це залежить від впровадження, але подібні методи можна використовувати.


У мене є проблема з тим, що "ми можемо випадково переставити послідовність введення для отримання аварійного випадку". Чому це можна зробити швидше, ніж час, необхідний для сортування?
— Сашо Ніколов

1
Ви можете переставити будь-яку послідовність чисел, це займе часу, де - довжина послідовності. Очевидно, що будь-який алгоритм сортування на основі порівняння повинен мати складність принаймні тому навіть якщо ви додасте до його складності, це не зміниться настільки сильно. У будь-якому випадку ми говоримо про порівняння, а не про час, складність часу залежить від впровадження та роботи машини, як я згадував у відповіді. NNO(Nlog⁡N)N
— Bartosz Przybylski

Я думаю, що я був сонним, ти маєш рацію, послідовність може перетворюватися в лінійний час.
— Сашо Ніколов

Оскільки , чи порівняння пов'язане правильним для вибору сортування? Схоже, ви маєте на увазі, що він робить середнє порівняння O (n log n). HN=Θ(logN)
— templatetypedef

Гамма = 0,577216 - константа Ейлера-Машероні. Відповідна глава - "Мистецтво програмування", том 3, розділ 5.2.2 стор. 109 і 129. Як ви точно побудували випадок сортування міхура, особливо термін O (sqrt (N))? Ви просто нехтували нею?
— mxmlnkn

11

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

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

Більш конкретно, для сортування бульбашок потрібно, в середньому, підміни за кожну запис (кожен запис переміщується по елементу від початкової позиції до його кінцевої позиції, і кожен своп включає дві записи), тоді як для сортування вибору потрібно лише (один раз знайдено мінімум / максимум, він поміняється один раз до кінця масиву).n/41

Щодо кількості порівнянь, сортування бульбашок вимагає порівняння порівнянь, де - максимальна відстань між початковою позицією запису та її кінцевою позицією, яка зазвичай більша за для рівномірно розподілених початкових значень. Однак вибір сортування завжди потребує порівняння .k×nkn/2(n−1)×(n−2)/2

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


1
це навіть дуже хороша відповідь
— Grijesh Chauhan

яку книгу ви віддаєте перевагу?
— Гріеш Чаухан

@GrijeshChauhan: Книги - справа смаку, тому прийміть будь-які рекомендації із зерном солі. Мені особисто подобається "Вступ до алгоритмів" Кормена, Лейзерсона та Рівеста, який дає хороший огляд по ряду тем, і серія "Мистецтво комп'ютерного програмування" Кнута, якщо вам потрібно більше / всі подробиці з будь-якої конкретної теми. Можливо, ви хочете перевірити, чи запитували про книги раніше тут, або опублікувати це питання, якщо це не так.
— Педро

Для мене третій пункт у вашій відповіді - це фактична відповідь. Не графіки для великих входів, наведені в іншій відповіді.
— переоцінка

3

Сортування бульбашок використовує більше разів заміни, тоді як сортування вибору уникає цього.

При використанні вибору сортування він міняється nмаксимум разів. але при використанні сортування бульбашок він майже змінюється n*(n-1). І очевидно, що час читання менше, ніж часу на запис навіть у пам'яті. Час порівняння та інший час роботи можна ігнорувати. Тому час підкачки є критичним вузьким місцем проблеми.


Я думаю, що інша відповідь Bartek є більш розумною, але я не можу проголосувати чи коментувати ... До речі, час написання все-таки впливає більше, і я сподіваюся, що він може це врахувати, якщо побачить це і погодиться.
— simonmysun

Ви не можете просто ігнорувати кількість порівнянь, оскільки є випадки використання, коли час, витрачений на порівняння двох елементів, може значно перевищити час, витрачений на обмін двома елементами. Розглянемо пов'язаний список надзвичайно довгих рядків (скажімо, по 100 тис. Символів у кожному). Читання в кожному рядку займе набагато більше часу, ніж переназначення вказівника.
— Ірвін Лім

@IrvinLim Я думаю, що ти можеш мати рацію, але, можливо, мені доведеться переглянути статистичні дані, перш ніж передумати.
— simonmysun
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.