Шелсорт

С Википедије, слободне енциклопедије
(преусмерено са Shellsort)
Šelsort
Step-by-step visualisation of Shellsort
Shellsort with gaps 23, 10, 4, 1 in action.
KlasaAlgoritmi sortiranja
Struktura podatakaNiz
Najgora performancazavisi od raskoraka
Najbolja performancazavisi od raskoraka
Prosečna performancazavisi od raskoraka
Najgora prostorna kompleksnostО(n) ukupan, O(1) pomoćni prostor
Shell sort алгоритам линије у боји

Šelsort (engl. Shellsort) је једноставан алгоритам за сортирање у месту заснован на поређењу елемената. Ово је генерализација сортирања код којих елементи мењају места, као што су Сортирање уметањем или Сортирање мехуром. Елементи који су удаљенији се пореде и замењују места раније него ближи елементи. Започиње се од најудаљенијих елемената. Прву верзију овог алгоритма објавио је Доналд Шел 1959. године.[1][2] Време извршавања овог алгоритма зависи од секвенца раскорака (енгл. gap) које користи.

Опис[уреди | уреди извор]

Шелсорт је генерализација алгоритма Сортирање уметањем, која дозвољава замену елемената који нису суседни. Идеја је да се елементи уреде у низ, тако да сваки њен подниз који почиње на било ком индексу, и чини га сваки наредни хти елемент, буде сортиран. Овакав низ је х-сортиран. Почиње се са великим х, што омогућава премештање удаљених елемената у оригиналном низу, и тиме смањује количину премештања која би се јавила ако би само суседни елементи могли да замењују места. Ако је низ к-сортиран, за к мање од х, он је и х-сортиран. Смањујући х у свакој итерацији до вредности 1 гарантује сортитан низ на крају извршавања алгоритма.

Испод је дат пример извршавања Шелсорта, са раскорацима 5, 3 и 1.

У првом проласку, сортирају се елементи на удаљености 5, односно соритају се поднизови (а1, а6, а11), (а2, а7, а12), (а3, а8), (а4, а9), (а5, а10).

На пример, подниз (а1, а6, а11) се од (62, 17, 25) трансофмише у (17, 25, 62). У следећем пролазу врши се 3-сортирање на поднизовима (а1, а4, а7, а10), (а2, а5, а8, а11), (а3, а6, а9, а12). У последњем пролазу 1-сортирање је уобичајено сортирање уметањем над целим низом (а1,..., а12).

Као што пример илуструје, поднизови који се користе у алгоритму су у почетку кратки. У сваком следећем пролазу они су дузи, али и уређенији услед претходних пролаза. У оба случаја, соритање уметањем ради ефикасно.

Шелсорт није стабилан алгоритам. Елементи са истим вредностима не морају се у резултујућм низу наћи у истом редоследу као у оригиналном. Пошто је заснован на алгоритму уметањем, ради брже што је почетни низ уређенији.

Псеудокод[уреди | уреди извор]

# Sortirati niz a[0...n-1].
gaps = [701, 301, 132, 57, 23, 10, 4, 1]

foreach (gap in gaps)
{
    # Uraditi sortiranje umetanjem za svaku gap veličinu.
    for (i = gap; i < n; i += 1)
    {
        temp = a[i]
        for (j = i; j >= gap and a[j - gap] > temp; j -= gap)
        {
            a[j] = a[j - gap]
        }
        a[j] = temp
    }

}

Гап секвенце[уреди | уреди извор]

Није лако одредити оптималне вредности за раскораке. Свака секвенца која садржи вредност 1 гарантује коректно сортирање. Међутим, особине алгоритма се доста разликују при различитим вредностима раскорака.

У табели се пореде најчешће предлагане вредности за раскораке. У некима оне зависе од величине улазног низа (Н), док су код других секвенце бесконачне, при чему вредности мање од Н треба посматрати у обрнутом редоследу.

Генерал терм (к ≥ 1) Цонцрете гапс Wорст-цасе
тиме цомплеxитy
Аутхор анд yеар оф публицатион
[wхен Н=2п] Схелл, 1959
Франк & Лазарус, 1960
Хиббард, 1963
, префиxед wитх 1 Папернов & Стасевицх, 1965
суццессиве нумберс оф тхе форм Пратт, 1971
, нот греатер тхан Кнутх, 1973
Инцерпи & Седгеwицк, 1985
, префиxед wитх 1 Седгеwицк, 1986
Седгеwицк, 1986
? Гоннет & Baeza-Yates, 1991
? Токуда, 1992
ункноwн ? Циура, 2001

Када бинарна репрезентација броја Н садржи много узастопних нула, Шелсорт, користећи оригиналну Шелову секвенцу, има Θ(Н2) поређења у најгорем случају. На пример, овај случај се јавља када је Н степен двојке, када елементи већи и мањи од медијане заузму немапрне и парне позиције редом, јер се пореде тек у последњој итерацији.

Гоннет и Баеза-Yатес су закључили да Шелсорт у просеку користи најмање поређења када је однос узастопних раскорака близак 2.2. Због тога су се њихова секвенца са односом 2.2 и Токудина секвенца са односом 2.25 показале ефикасним. Међутим, није познато зашто је тако. Седгеwицк предлаже раскораке који имају низак Највећи заједнички делилац или су узајамно прости.

Имајући у виду просечан број поређења, најбоље познате секвенце гапова су 1, 4, 10, 23, 57, 132, 301, 701 и сличне. Ови раскораци су добијени емпиријски. Оптимални раскораци већи од 701 остају непознати, али добри резултати се добијају настављањем ове секвенце по формули .

Токудина секвенца, дефинисана формулом , wхере , , се препоручује у пракси.

Сложеност[уреди | уреди извор]

Важи следећа особина: након х2-сортирања било ког х1-сортираног низа, низ остаје х1-сортиран. Сваки х1-сортирани и х2-сортирани низ је такође и (а1х1+а2х2)-сортиран, за свако ненегативно целобројно а1 и а2. Због овога је сложеност Шелсорта у најгорем случају везана за Проблем новчића: за дате узајамно просте бројеве х1,..., хн, Фробенијев број г(х1,..., хн) је највећи цели број који се не може представити као а1х1+ ... +анхн са ненегативним целим бројевима а1,..., ан. Користећи познату формулу за овај проблем, можемо одредити сложност Шелсорта у најгорем случају за неке класе секвенци раскорака.

Када су раскораци степени двојке, Еспелид је израчунао да да је просечан број операција . Доналд Кнут је одредио просечну сложеност сортирања низа од Н елемената користећи два раскорака (х, 1) која износи . Следи да Шелсорт са два проласка, где је х = Θ(Н1/3), у просеку користи О(Н5/3) поређења. Ендру Јау је одредио просечну сложеност Шелсорта са три проласка. Његов резултат су прерадили Јансон и Кнут. Просечан број поређења при коришћењу три раскорака (цх, цг, 1), где су х и г узајамно прости, је у првом, у другом и у трећем проласку. ψ(х, г), које се појављује у последњој формули, је функција апроскимативно једнака . Када је х = Θ(Н7/15) и г = Θ(х1/5), просечно време сортирања је О(Н23/15).

На основу експеримената, сматра се да се Шелсорт са Хиббардовим и Кнутовим секвенцама раскорака извршава у О(Н5/4) времену у просеку, и да Гоннет и Баеза-Yатес-ова секвенца захтевају 0.41НлнН(лн лнН+1/6) премештања елемената у просеку. Апроксимације просечног броја операција раније датих секвенца нису успеле за низове са преко милион елемената.

Следећи граф показује просечан број поређења елемената за различите варијанте Шелсорта. Вредности су подељене теоретском доњом границом лог2Н!. Секвенца 1, 4, 10, 23, 57, 132, 301, 701 је продужена служећи се формулом .

Према Колмогорољевој сложености, доказано је да је доња граница за просечан број операција при м пролазака у Шелсорту: Ω(мН1+1/м) када је м≤лог2Н и Ω(мН) wхен м>лог2Н. Према томе, Шелсорт има могућност да у просеку има О(НлогН) сложеност само када користи секвенце раскорака којима број раскорака расте пропорционално логаритму величине низа. Међутим, није познато да ли Шелсорт може заиста да достигне ову сложеност, која је оптимална за сортирање поређењем.

Према Плаxтону, Поонену и Суелу, сложеност алгоритма у најгорем случају је Ω(Н(логН/лог логН)2).

Примена[уреди | уреди извор]

Шелсорт се ретко користи у пракси. Врши више операција и користи више кеш меморије процесора од Квиксорта. Међутим, како се може лако имплементирати и како не користи стек простор, неке имплементације qсорт фукције у C библиотеци је користе. На пример, Шелсорт се користи у уЦлибц библиотеци. Из сличних разлога, имплементиран је и у Линукс кренелу.

Референце[уреди | уреди извор]

  1. ^ Схелл, D.L. (1959). „А Хигх-Спеед Сортинг Процедуре” (ПДФ). Цоммуницатионс оф тхе АЦМ. 2 (7): 30—32. дои:10.1145/368370.368387. Архивирано из оригинала (ПДФ) 30. 08. 2017. г. Приступљено 08. 01. 2014. 
  2. ^ Some older textbooks and references call this the "Shell-Metzner" sort after Marlene Metzner Norton, but according to Metzner, "I had nothing to do with the sort, and my name should never have been attached to it." See „Схелл сорт”. Натионал Институте оф Стандардс анд Тецхнологy. Приступљено 17. 7. 2007. 

Литература[уреди | уреди извор]

  • Кнутх, Доналд Е. (1997). „Схелл'с метход”. Тхе Арт оф Цомпутер Программинг. Волуме 3: Сортинг анд Сеарцхинг (2нд изд.). Реадинг, Массацхусеттс: Аддисон-Wеслеy. стр. 83—95. ИСБН 978-0-201-89685-5. 
  • Analysis of Shellsort and Related Algorithms, Robert Sedgewick, Fourth European Symposium on Algorithms, Barcelona, September 1996.

Спољашње везе[уреди | уреди извор]