Ця стаття містить правописні, лексичні, граматичні, стилістичні або інші мовні помилки, які треба виправити. (липень 2020) |
Сортування гребінцем (англ. Comb sort) — спрощений алгоритм сортування, розроблений Влодеком Добошєвічем (Wlodek Dobosiewicz) у 1980 році, і пізніше заново дослідженим та популяризованим Стефаном Лакеєм (Stephen Lacey) та Річардом Боксом (Richard Box), котрі написали про нього в журналі у квітні 1991 р. Сортування гребінцем є поліпшенням алгоритму сортування бульбашкою, і конкурує у швидкодії з алгоритмом Швидке сортування. Основна його ідея полягає в тому, щоб усунути так званих «черепах», або малих значень ближче до кінця списку, оскільки у сортування бульбашкою вони сильно уповільнюють процес сортування. (Кролики та великі сортування на початку списку у сортуванні бульбашкою не являють собою проблеми).
Клас | Алгоритм сортування |
---|---|
Структура даних | масив |
Найгірша швидкодія | |
Найкраща швидкодія | |
Середня швидкодія | |
Просторова складність у найгіршому випадку | О(n) загальний, O(1) допоміжний |
Оптимальний | Так |
У сортуванні бульбашкою, коли два елементи порівнюються, вони завжди мають розрив (відстань один від одного) рівну 1. Основна ідея сортування гребінцем полягає у тому, що цей розрив може бути більший одиниці. (Алгоритм Сортування Шелла також базується на даній ідеї, однак, він є модифікацією алгоритму сортування включенням, а не сортування бульбашкою).
Розрив починається зі значення, що рівне довжині списку, поділеного на фактор зменшення (зазвичай, 1.3; див. нижче), і список сортується з урахуванням цього значення (при необхідності воно заокруглюється до цілого). Потім розрив знову ділиться на фактор розриву, і список продовжує сортуватись з новим значенням, процес продовжується доти, доки розрив рівний 1. Далі список сортується з розривом рівним 1 доти, доки не буде повністю відсортований. Таким чином, фінальний етап сортування аналогічний такому ж у сортуванні бульбашкою, однак, до цього «черепахи» усуваються.
Фактор зменшення
Фактор зменшення справляє великий ефект на швидкість алгоритму сортування гребінцем. В оригінальній статті, автор пропонує значення 1.3 після багатьох експериментів з іншими значеннями.
Текст описує процес вдосконалення алгоритму використовуючи значення як фактор зменшення. Вона також мість приклад використання алгоритму на псевдокоді.
Приклади реалізації на різних мовах програмування
Псевдокод
function combsort11(array input) gap := input.size
loop until gap > 1 and swaps = 1 if gap > 1 gap := gap / 1.3 end if
i := 0 swaps := 0
loop until i + gap <= input.size if input[i] > input[i+gap] swap(input[i], input[i+gap]) swaps := 1 end if i := i + 1 end loop
end loop end function
C
int newGap(int gap) { gap /= 1.3; if (gap < 1) return 1; return gap; } void combSort(int* a, int len) { int gap = len; bool swapped = true; while (gap > 1 || swapped) { swapped = false; gap = newGap(gap); for (int i = 0; i < len - gap; ++i) { if (a[i] > a[i + gap]) { swap(a[i], a[i + gap]); swapped = true; } } } }
Java
private static int newGap(int gap) { gap = gap * 10 / 13; if(gap < 1) return 1; return gap; } private static void sort(int a[]) { int gap = a.length; boolean swapped; do { swapped = false; gap = newGap(gap); for(int i = 0; i < (a.length - gap); i++) { if(a[i] > a[i + gap]){ swapped = true; int temp = a[i]; a[i] = a[i + gap]; a[i + gap] = temp; } } } while(gap > 1 || swapped); }
Python
def update_gap(gap): gap = (gap * 10) / 13 if gap == 9 or gap == 10: gap = 11 return max(1, gap) def combsort(x): gap = len(x) swapped = True if gap < 2: return while gap > 1 or swapped: gap = update_gap(gap) swapped = False for i in range(0, len(x) - gap, gap): if x[i] > x[i + gap]: x[i], x[i + gap] = x[i + gap], x[i] swapped = True
Див. також
Примітки
- Brejová, Bronislava. "Analyzing variants of Shellsort"
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Cya stattya mistit pravopisni leksichni gramatichni stilistichni abo inshi movni pomilki yaki treba vipraviti Vi mozhete dopomogti vdoskonaliti cyu stattyu pogodivshi yiyi iz chinnimi movnimi standartami lipen 2020 Sortuvannya grebincem angl Comb sort sproshenij algoritm sortuvannya rozroblenij Vlodekom Doboshyevichem Wlodek Dobosiewicz u 1980 roci i piznishe zanovo doslidzhenim ta populyarizovanim Stefanom Lakeyem Stephen Lacey ta Richardom Boksom Richard Box kotri napisali pro nogo v zhurnali u kvitni 1991 r Sortuvannya grebincem ye polipshennyam algoritmu sortuvannya bulbashkoyu i konkuruye u shvidkodiyi z algoritmom Shvidke sortuvannya Osnovna jogo ideya polyagaye v tomu shob usunuti tak zvanih cherepah abo malih znachen blizhche do kincya spisku oskilki u sortuvannya bulbashkoyu voni silno upovilnyuyut proces sortuvannya Kroliki ta veliki sortuvannya na pochatku spisku u sortuvanni bulbashkoyu ne yavlyayut soboyu problemi Sortuvannya grebincemKlasAlgoritm sortuvannyaStruktura danihmasivNajgirsha shvidkodiyaW n 2 displaystyle Omega n 2 Najkrasha shvidkodiyaO n displaystyle O n Serednya shvidkodiyaW n l o g n displaystyle Omega nlogn Prostorova skladnist u najgirshomu vipadkuO n zagalnij O 1 dopomizhnijOptimalnijTak U sortuvanni bulbashkoyu koli dva elementi porivnyuyutsya voni zavzhdi mayut rozriv vidstan odin vid odnogo rivnu 1 Osnovna ideya sortuvannya grebincem polyagaye u tomu sho cej rozriv mozhe buti bilshij odinici Algoritm Sortuvannya Shella takozh bazuyetsya na danij ideyi odnak vin ye modifikaciyeyu algoritmu sortuvannya vklyuchennyam a ne sortuvannya bulbashkoyu Rozriv pochinayetsya zi znachennya sho rivne dovzhini spisku podilenogo na faktor zmenshennya zazvichaj 1 3 div nizhche i spisok sortuyetsya z urahuvannyam cogo znachennya pri neobhidnosti vono zaokruglyuyetsya do cilogo Potim rozriv znovu dilitsya na faktor rozrivu i spisok prodovzhuye sortuvatis z novim znachennyam proces prodovzhuyetsya doti doki rozriv rivnij 1 Dali spisok sortuyetsya z rozrivom rivnim 1 doti doki ne bude povnistyu vidsortovanij Takim chinom finalnij etap sortuvannya analogichnij takomu zh u sortuvanni bulbashkoyu odnak do cogo cherepahi usuvayutsya Faktor zmenshennyaFaktor zmenshennya spravlyaye velikij efekt na shvidkist algoritmu sortuvannya grebincem V originalnij statti avtor proponuye znachennya 1 3 pislya bagatoh eksperimentiv z inshimi znachennyami Tekst opisuye proces vdoskonalennya algoritmu vikoristovuyuchi znachennya 1 1 1 e f 1 247330950103979 displaystyle 1 left 1 frac 1 e varphi right approx 1 247330950103979 yak faktor zmenshennya Vona takozh mist priklad vikoristannya algoritmu na psevdokodi Prikladi realizaciyi na riznih movah programuvannyaPsevdokod function combsort11 array input gap input size loop until gap gt 1 and swaps 1 if gap gt 1 gap gap 1 3 end if i 0 swaps 0 loop until i gap lt input size if input i gt input i gap swap input i input i gap swaps 1 end if i i 1 end loop end loop end function C int newGap int gap gap 1 3 if gap lt 1 return 1 return gap void combSort int a int len int gap len bool swapped true while gap gt 1 swapped swapped false gap newGap gap for int i 0 i lt len gap i if a i gt a i gap swap a i a i gap swapped true Java private static int newGap int gap gap gap 10 13 if gap lt 1 return 1 return gap private static void sort int a int gap a length boolean swapped do swapped false gap newGap gap for int i 0 i lt a length gap i if a i gt a i gap swapped true int temp a i a i a i gap a i gap temp while gap gt 1 swapped Python def update gap gap gap gap 10 13 if gap 9 or gap 10 gap 11 return max 1 gap def combsort x gap len x swapped True if gap lt 2 return while gap gt 1 or swapped gap update gap gap swapped False for i in range 0 len x gap gap if x i gt x i gap x i x i gap x i gap x i swapped TrueDiv takozhSortuvannya bulbashkoyu Sortuvannya zmishuvannyamPrimitkiBrejova Bronislava Analyzing variants of Shellsort