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


109

Я намагаюся зрозуміти відмінності між сортуванням вставки та сортуванням вибору.

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


8
Вікіпедія для вибору сортування постачається з псевдокодом та гарними ілюстраціями, як і сортування для вставки .
Г. Бах

6
@ G.Bach - дякую за це ... Я читав обидві сторінки кілька разів, але не розумію різниці - звідси це питання.
eb80

3
За інформацією Computerphile, вони однакові: youtube.com/watch?v=pcJHkWwjNl4
Tristan Вперед

Відповіді:


185

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

Давши список, візьміть поточний елемент і обміняйте його з найменшим елементом праворуч поточного елемента. Сортування вибору

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

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

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

Джерело: http://cheetahonfire.blogspot.com/2009/05/selection-sort-vs-insertion-sort.html


2
@Nikolay - Це щойно скопійовано з cheetahonfire.blogspot.com/2009/05/…, який я вже читав. Чи є щось більш узгоджене, як я читав суперечливі статті.
eb80

5
Основна відмінність - це крок вибору. Сортуючий вибір відбирає найменший та замінює його першим. Сортуючий вставкою, він вставляє поточне у відповідне місце
Микола Костов

6
@ eb80 Я не впевнений, який матеріал ти читаєш, але я не бачу, як приклад може бути конкретнішим за цей?
Г. Бах

23
А як щодо кількості свопів? Вибір завжди робить n (n-1) / 2 порівнянь, але в гіршому випадку він буде робити коли-небудь свопи n-1. У гіршому випадку Вставка зробить n (n-1) / 2 порівняння, а також n (n-1) / 2 свопів.
Джейсон Джейм

2
@Adorn Ні один із цих алгоритмів розділення та підкорення.
Asky McAskface

63

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

Різниця полягає в тому, що робить внутрішня петля:

  • У сортуванні вибору внутрішня петля знаходиться над несортованими елементами. Кожен прохід вибирає один елемент і переміщує його до остаточного місця (у поточному кінці відсортованої області).

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

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

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


23

СОРТ РОБОТИ
Припустимо, що існує масив чисел, написаних певним / випадковим способом, і дозвольмо сказати, що ми маємо впорядковуватись у порядку збільшення. Отже, візьміть одне число за один раз і замініть їх на найменше. доступні в списку. виконавши цей крок, ми в кінцевому підсумку отримаємо бажаний результат.

введіть тут опис зображення



ІНСТЕРЦІЙНИЙ СОРТ
Маючи на увазі подібне припущення, але єдиною різницею є те, що на цей раз ми вибираємо по одному число за один раз і вставляємо його в перекреслену частину, що зменшує порівняння, а значить, і більш ефективно.

введіть тут опис зображення


Просто перевірте mycodeschool на Youtube. Однак ця відповідь компліментує тим, що пояснено у відео 2 алгоритмів на youtube.
JaydeepW

21

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

Найпростіший спосіб зрозуміти алгоритми сортування - це часто отримати детальний опис алгоритму (не розпливчасті речі типу "цей сорт використовує своп. Десь. Я не кажу де"), отримати кілька ігрових карт (5-10 повинно вистачити для простих алгоритмів сортування) та запустіть алгоритм вручну.

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

Сортування вставки: візьміть елемент відразу за відсортованими даними, проскануйте відсортовані дані, щоб знайти місце для їх розміщення, і покладіть їх туди. Повторіть до кінця.

Сортування вставки може використовувати своп під час фази "сканування", але це не обов'язково, і це не найефективніший спосіб, якщо ви не сортуєте масив типу даних, який: (a) неможливо перемістити, лише скопіювати або замінити; і (b) копіювати дорожче, ніж міняти місцями. Якщо сортування вставок використовує swap, спосіб його роботи полягає в тому, що ви одночасно шукаєте місце і поміщаєте новий елемент туди, багаторазово поміняючи новий елемент елементом безпосередньо перед ним, до тих пір, поки елемент, перш ніж він буде більшим, ніж це. Як тільки ви досягнете елемента, який не більший, ви знайшли правильне розташування і переходите до наступного нового елемента.


1
Це дуже корисно ... Останній абзац потрапляє в плутанину, яку я мав, що випливала з варіантів для кожного виду.
eb80

1
+1 за те, що зазначати, що використання сортування вставок у зв’язаному списку - це зовсім інша ефективність заміни, ніж у масиві на місці
Gavin Achtemeier

11

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

  • Сортування вставки : вставляє наступний елемент у правильному положенні;

  • Сортування вибору : вибирає найменший елемент та обмінює його з поточним елементом;

Також сортування вставки стабільне, на відміну від сортування вибору .

Я реалізований і в python, і варто зазначити, наскільки вони схожі:

def insertion(data):
    data_size = len(data)
    current = 1
    while current < data_size:
        for i in range(current):
            if data[current] < data[i]:
                temp = data[i]
                data[i] = data[current]
                data[current] = temp

        current += 1

    return data

З невеликою зміною можна скласти алгоритм сортування вибору.

def selection(data):
    data_size = len(data)
    current = 0
    while current < data_size:
        for i in range(current, data_size):
            if data[i] < data[current]:
                temp = data[i]
                data[i] = data[current]
                data[current] = temp

        current += 1

    return data

Вибачте, мені було цікаво, чому (алгоритм сортування вибору) дані [i] обмінюються даними [поточними], коли дані [i] є меншими. У сортуванні вибору базового / оригінального (?) Ми знаходимо мінімальне значення серед діапазону (i, data_size) та обмінюємось даними [i] з цим мінімальним значенням ... це трохи інше ...
Tony Ma

4

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


4

Коротко,

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

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


3

Я ще спробую: подумайте, що трапиться в щасливому випадку майже відсортованого масиву.

Під час сортування, масив можна вважати таким, що складається з двох частин: ліва сторона - сортована, права - несортована.

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

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

До речі, саме це покращує групу вибору при сортуванні - вона здатна набагато швидше знайти найменший елемент завдяки купі .


3

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

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


3

Обидва алгоритми зазвичай працюють так

Крок 1: Візьміть наступний несортований елемент із несортованого списку

Крок 2: поставте його в потрібне місце у відсортованому списку.

Один із кроків простіший за одним алгоритмом і навпаки.

Сортування вставки : ми беремо перший елемент несортованого списку, десь вкладаємо його в відсортований список . Ми знаємо, де взяти наступний елемент (перша позиція у несортованому списку), але він потребує певної роботи, щоб знайти, де його ( десь ) поставити . Крок 1 простий.

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


2

Внутрішня петля сортування вставки проходить через вже відсортовані елементи (всупереч сортуванню вибору). Це дозволяє йому перервати внутрішню петлю, коли знайдено правильне положення . Що означає, що:

  1. Внутрішня петля в середньому випадку пройде лише половину її елементів.
  2. Внутрішня петля буде скасована ще раніше, якщо масив майже відсортований.
  3. Внутрішній цикл негайно перерветься, якщо масив вже відсортований, що зробить складність сортування вставки лінійним у цьому випадку.

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


1

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

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

Сортування вставки може бути показано як:

    for(i=1;i<n;i++)
        for(j=i;j>0;j--)
            if(arr[j]<arr[j-1])
                temp=arr[j];
                arr[j]=arr[j-1];
                arr[j-1]=temp;

Сортування вибору може бути показано як:

    for(i=0;i<n;i++)
        min=i;
        for(j=i+1;j<n;j++)
        if(arr[j]<arr[min])
        min=j;
        temp=arr[i];
        arr[i]=arr[min];
        arr[min]=temp;

1

Вибір цих 2 алгоритмів сортування зводиться до використовуваної структури даних.

Коли ви використовуєте масиви, використовуйте сортування вибору (хоча чому, коли ви можете використовувати qsort?). Коли ви використовуєте пов'язані списки, використовуйте сортування вставки.

Це відбувається тому:

  • Перехід пов'язаного списку коштує дорожче, ніж масиви.
  • Вставка пов'язаного списку набагато дешевше, ніж масиви.

Сортування вставки вводить нове значення в середину відсортованого сегмента. Отже, дані потрібно «відсунути назад». Однак, використовуючи зв'язаний список, перекрутивши 2 вказівника, ви фактично відсунули весь список назад. У масиві ви повинні виконати n - i свопи, щоб відсунути значення назад, що може бути дуже дорого.

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


0

Просте пояснення може бути наступним:

Дано : несортований масив або список номерів.

Постановка проблеми : сортувати список / масив чисел у порядку зростання, щоб зрозуміти різницю між сортуванням вибору та сортуванням вставки.

Сортування вставки:Ви бачите список зверху вниз для легшого розуміння. Ми розглядаємо перший елемент як наше початкове мінімальне значення. Тепер ідея полягає в тому, що ми переходимо по кожному індексу цього списку / масиву лінійно, щоб з'ясувати, чи є інший елемент у будь-якому індексі, який має менше значення, ніж початкове мінімальне значення. Якщо ми знайдемо таке значення, ми просто поміняємо значення на їх індекси, тобто скажімо, що 15 було мінімальним початковим значенням в індексі 1, а під час лінійного обходу індексів ми зустрічаємо число з меншим значенням, скажімо, 7 при індексі 9 Тепер це значення 7 в індексі 9 заміняється індексом 1, який має 15 як його значення. Цей обхід надалі буде порівняти зі значенням поточного індексу з рештою індексів, щоб замінити на менші значення. Це триває до другого останнього індексу списку / масиву,

Сортування вибору:Припустимо, що перший елемент індексу списку / масиву відсортований. Тепер з елемента другого індексу ми порівнюємо його з його попереднім індексом, щоб побачити, чи значення менше. Обхід можна візуалізувати на дві частини, відсортовані та несорті. Можна було б візуалізувати перевірку порівняння від несортованого до відсортованого за заданим індексом у списку / масиві. Скажімо, у вас є значення 19 в індексі 1 і значення 10 в індексі 3. Ми вважаємо проходження від несортованого до відсортованого, тобто праворуч ліворуч. Отже, скажімо, що ми повинні сортувати за індексом 3. Ми бачимо, що він має менше значення, ніж індекс 1, коли ми порівнюємо справа наліво. Після ідентифікації ми просто розміщуємо це число 10 індексу 3 на місці індексу 1, який має значення 19. Початкове значення 19 в індексі 1 зміщується на одне місце праворуч.

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


0

Сортування вставки не змінюється. Незважаючи на те, що він використовує тимчасову змінну, сенс використання temp var полягає в тому, що коли ми знайшли, що значення в індексі є меншим порівняно зі значенням до попереднього індексу, ми переносимо велике значення на місце меншого значення індекс, який би надписував речі. Тоді ми використовуємо тимчасову вару для заміни на попередній індекс. Приклад: 10, 20, 30, 50, 40. ітерація 1: 10, 20, 30, 50, 50. [temp = 40] ітерація 2: 10,20, 30, 40 (значення темпу), 50. Отже, ми просто вставте значення в потрібне положення з якоїсь змінної.

Але коли ми розглядаємо сортування селекції, ми спочатку знаходимо індекс, що має нижче значення, і заміняємо це значення на значення з першого індексу, і продовжуємо багаторазово міняти, поки всі індекси не будуть відсортовані. Це точно так само, як і традиційна заміна двох чисел. Приклад: 30, 20, 10, 40, 50. Ітерація 1: 10, 20, 30, 40, 50. Тут temp var використовується виключно для заміни.



0

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

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

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

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

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

Висновок:

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

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


0

Хоча Складність вибору сортування та сортування вставки однакова, тобто n (n - 1) / 2. Середня продуктивність сортування краще. Випробуваний на моєму i5 процесорі з випадковими 30000 цілими числами, сортування вибору в середньому займало 1,5 секунди, а сортування вставки - в середньому 0,6.


Ласкаво просимо до StackOverflow і дякуємо за відповідь. Швидше за все, ви можете побачити, що багато людей вже зробили приємні відповіді візуальними ілюстраціями. Наприклад, Микола Костов 7 років тому заявив, що складність у часі однакова лише в гіршому випадку для сортування вставки. Якщо ви вважаєте, що він помиляється, ми радимо вам розширити свою відповідь більш детально.
Максим Сагайдачний

-1

Простіше кажучи, (і, мабуть, найпростіший спосіб досягти високого рівня розуміння проблеми)

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

Однак у сортуванні вибору те, що ви робите, схоже на упорядкування картки. Ти дивишся на картки, береш найменшу, розміщуєш її аж до лівої сторони тощо.


3
Він запитує про різницю між сортуванням відбору та вставки
XuDing

-1

select - вибір конкретного елемента (найнижчий) та розміщення його елементами i (без повторення). (тобто перше, друге, третє .......), отже, складання відсортованого списку з одного боку.

вставлення- порівняння першого та другого порівняння третього та другого порівняння четвертого із третім, другого та першого ......

посилання, де порівнюються всі сортування

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