Сортування гребінцем Зміст Фактор зменшення | Приклади...

Multi tool use
Multi tool use


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


англ.алгоритм сортуванняByte Magazineсортування бульбашкоюШвидке сортуваннясортування бульбашкоюсортуванні бульбашкоюсортуванні бульбашкою,Сортування Шелласортування включеннямсортування бульбашкоюсортуванні бульбашкою





































Сортування гребінцем

Visualisation of comb sort
Клас
Алгоритм сортування
Структура даних
масив
Найгірша швидкодія
Ω(n2){displaystyle Omega (n^{2})}[1]
Найкраща швидкодія
O(n){displaystyle O(n)}
Середня швидкодія
Ω(nlogn){displaystyle Omega (nlogn)}
Просторова складність у найгіршому випадку
О(n) загальний, O(1) допоміжний
Оптимальний
Так

Сортування гребінцем (англ. Comb sort) — спрощений алгоритм сортування, розроблений Влодеком Добошєвічем (Wlodek Dobosiewicz) у 1980 році, і пізніше заново слідженим та популяризованим Стефаном Лакеєм (Stephen Lacey) та Річардом Боксом (Richard Box), котрі написали про нього в журналі Byte Magazine у квітні 1991 р. Сортування гребінцем є поліпшенням алгоритму сортування бульбашкою, і конкурує у швидкодії з алгоритмом Швидке сортування. Основна його ідея полягає в тому, щоб усунути так званих «черепах», або малих значень ближче до кінця списку, оскільки у сортування бульбашкою вони сильно уповільнюють процес сортування. (Кролики та великі сортування на початку списку у сортуванні бульбашкою не являють собою проблеми).


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


Розрив починається зі значення, що рівне довжині списку, поділеного на фактор зменшення (зазвичай, 1.3; див. нижче), і список сортується з урахуванням цього значення (при необхідності воно заокруглюється до цілого). Потім розрив знову ділиться на фактор розриву, і список продовжує сортуватись з новим значенням, процес продовжується доти, доки розрив рівний 1. Далі список сортується з розривом рівним 1 доти, доки не буде повністю відсортований. Таким чином, фінальний етап сортування аналогічний такому ж у сортуванні бульбашкою, однак, до цього «черепах» усувається.




Зміст






  • 1 Фактор зменшення


  • 2 Приклади реалізації на різних мовах програмування


    • 2.1 Псевдокод


    • 2.2 C


    • 2.3 Java


    • 2.4 Python




  • 3 Див. також


  • 4 Примітки





Фактор зменшення |


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


Текст описує процес вдосконалення алгоритму використовуючи значення 1/(1−1eφ)≈1.247330950103979{displaystyle 1/left(1-{frac {1}{e^{varphi }}}right)approx 1.247330950103979} як фактор зменшення. Вона також мість приклад використання алгоритму на псевдокоді.



Приклади реалізації на різних мовах програмування |



Псевдокод |


function combsort11(array input)
gap := input.size

    loop until gap <= 1 and swaps = 0
if gap > 1
gap := gap / 1.3
if gap = 10 or gap = 9
gap := 11
end if
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 == 9 || gap == 10)
gap = 11;
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 == 9 || gap == 10)
gap = 11;
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


Див. також |



  • Сортування бульбашкою

  • Сортування змішуванням



Примітки |





  1. Brejová, Bronislava. "Analyzing variants of Shellsort"






U,U6MoQVQJfuNZUcw9NW5o R1GL QscAnXZf30k8rOX AhaKR63Jq
4HqY7JfBQ 7O jNr6vdkiOD2t,hrr,bcs15jjTrU

Popular posts from this blog

nginx 12 FastCGI sent in stderr Primary script unknownBlank Page: wordpress on nginx+php-fpmNginx 1 FastCGI...

Фонтен-ла-Гаярд Зміст Демографія | Економіка | Посилання |...

Маріан Котлеба Зміст Життєпис | Політичні погляди |...