Sortiranje po Šelu (eng.Shellsort) уреди

Sortiranje po Šelu (eng.Shellsort) je takav algoritam za sortiranje niza da prolazi kroz niz više puta, da bi pri svakom prolazu vršio zamenu elemenata koji su udaljeni jedan od drugog. Generalno to je sortiranje elemenata slično sortiranju umetanjem (eng. insertion sort) ili sortiranje zamenom susednih elemenata (eng. bubble-sort). Nedostatak sortiranja zamenom susednih elemenata je što elemenat sa velikom vrednošću, a malom vrednošću indeksa putuje vrlo sporo na svoje mesto. Zamisao Donalda Šela (eng. Donald Shell)1959. godine je da se sortiranje zamenom susednih elemenata mođe ubrzati na način da se upoređuju elementi na većem razmaku (a ne na susednom), te da se napredovanjem algoritma taj razmak postepeno smanjuje, kako bi se na kraju upoređivali susedni elementi.

Opis уреди

Sortiranje po Šelu je jednostavno proširenje sortiranja umetanjem koje dopušta direktnu razmenu udaljenih elemenata.Proširenje se sastoji u tome da se kroz algoritam umetanja prolazi više puta, u prvom prolazu, umesto koraka 1 uzima se neki korak h koji je manji od koraka n (što omogućava razmenu udaljenih elemenata) i tako se dobija n-sortiran niz tj. niz u kome su elementi na rastojanju h sortirani, mada susedni elementi to ne moraju biti.U drugom prolazu kroz isti algoritam sprovodi se isti postupak ali za manji korak h. Sa prolazima nastavlja sve do korak h=1, u kome se dobija potpuno sortirani niz. Primer kako radi sortiranje po Šelu u 5,3 i 1 koraku pokazan je dole:

 

U prvom prolazu ili peto-sortiranju algoritam je razdvojio niz u pet podnizova(peto-sortiranje) (a1, a6, a11), (a2, a7, a12),(a3, a8), (a4, a9), (a5, a10).Na primer, zamenio je podniz (a1, a6, a11) od niza (62, 17, 25) u niz (17, 25, 62).Znači u podnizu je sortirao brojeve i tako je urađeno u svakom od pet podnizova.U sledećem prolazu algoritam je razdvojio niz u tri podniza (a1, a4, a7, a10),(a2, a5, a8, a11), (a3, a6, a9, a12).I u poslednjem prolazu algoritam je sredio niz po redu (a1,..., a12). Na ovaj način sortiranje je mnogo efikasnije.

Pseudokod уреди

Koristeći Marcin Ciura sekvencu sa unutrašnjim umetanjem sortiranja.

# Sort an array a[0...n-1].
gaps = [701, 301, 132, 57, 23, 10, 4, 1]

foreach (gap in gaps)
    # Do an insertion sort for each gap size.
    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

Kod u programskom jeziku C уреди

Kod je rađen u programskom jeziku C. Bira brojeve nasumično, a potom ih sortira.

#include <cstdlib>
#include <iostream>
#include <time.h>
 
using namespace std;
 
void print_niz(int *niz, int velicina) {
    for (int i=0; i<velicina; i++) {
        printf("%d",niz[i]);
    }
    printf("\n");
}
 
void shell_sort(int *niz, int velicina) {
    int skok = velicina/2;
    while (skok > 0) {
        for (int i=skok; i<velicina; i++) {
            for (int j=i; j>0; j=j-skok) {
                if(niz[j] < niz[j-1]){
                    int temp = niz[j];
                    niz[j] = niz[j-1];
                    niz[j-1] = temp;
                }
                else {
                    break;
                }
            }
        }        
        skok = skok/2;
    }
}
 
int main(int argc, char** argv) {
 
    srand((unsigned)time(0));
     
    int velicina = 10;
    int *niz = new int[velicina];
     
    for (int i=0; i<velicina; i++) {
        niz[i] = rand()%10+1;
    }
    print_niz(niz, velicina);
    shell_sort(niz, velicina);
    print_niz(niz, velicina);
	system ("PAUSE");
     
    return 0;
}

Sekvenca уреди

Svaka sekvenca koja sadrži 1 daje ispravno sortiranje, međutim, osobine tako dobijenih verzija sortiranja po Šelu mogu biti veoma različiti. Tabela poredi većinu predloženih sekvenci objavljenih do sada.Neke od njih imaju smanjenje elementata koji zavise od veličine sortiranog niza (N).

opšta funkcija (k ≥ 1) Koncentracija razmaka Najgori slučaj
vremenske zamršenosti
Autor i godina objavljivanja
      [kada je N=2p] Donald Shell, 1959
      Frank & Lazarus, 1960Frank, R.M.; Lazarus, R.B. (1960). „A High-Speed Sorting Procedure”. Communications of the ACM. 3 (1): 20—22. doi:10.1145/366947.366957. 
      Hibbard, 1963Hibbard, Thomas N. (1963). „An Empirical Study of Minimal Storage Sorting”. Communications of the ACM. 6 (5): 206—213. doi:10.1145/366552.366557. 
 , sa 1 pripremljenim     Papernov & Stasevich, 1965Papernov, A.A.; Stasevich, G.V. (1965). „A Method of Information Sorting in Computer Memories” (PDF). Problems of Information Transmission. 1 (3): 63—75. 
uzastopni brojevi obrazaca       Pratt, 1971Pratt, Vaughan Ronald (1979). Shellsort and Sorting Networks (Outstanding Dissertations in the Computer Sciences). Garland. ISBN 0-8240-4406-1. 
 , nije veća od       Knuth, 1973Knuth, Donald E. (1997). „Shell's method”. The Art of Computer Programming. Volume 3: Sorting and Searching (2nd изд.). Reading, Massachusetts: Addison-Wesley. стр. 83—95. ISBN 0-201-89685-0. 
 
 
 
 
    Incerpi & Robert Sedgewick (computer scientist), 1985Incerpi, Janet; Sedgewick, Robert (1985). „Improved Upper Bounds on Shellsort”. Journal of Computer and System Sciences. 31 (2): 210—224. 
 , sa 1 pripremljenim     Sedgewick, 1986
      Sedgewick, 1986Sedgewick, Robert (1986). „A New Upper Bound for Shellsort”. Journal of Algorithms. 7 (2): 159—173. doi:10.1016/0196-6774(86)90001-5. 
    ? Gonnet & Ricardo Baeza-Yates, 1991Gonnet, Gaston H.; Baeza-Yates, Ricardo (1991). „Shellsort”. Handbook of Algorithms and Data Structures: In Pascal and C (2nd изд.). Reading, Massachusetts: Addison-Wesley. стр. 161—163. ISBN 0-201-41607-7. 
    ? Tokuda, 1992Tokuda, Naoyuki (1992). „An Improved Shellsort”. Ур.: van Leeuven, Jan. Proceedings of the IFIP 12th World Computer Congress on Algorithms, Software, Architecture. Amsterdam: North-Holland Publishing Co. стр. 449—457. ISBN 0-444-89747-X. 
nepoznat   ? Ciura, 2001Ciura, Marcin (2001). „Best Increments for the Average Case of Shellsort”. Ур.: Freiwalds, Rusins. Proceedings of the 13th International Symposium on Fundamentals of Computation Theory (PDF). London: Springer-Verlag. стр. 106—117. ISBN 3-540-42487-3. 

Aplikacije уреди

Sortiranje po Šelu se sada retko koristi u ozbiljnim aplikacijama.Ona obavlja više operacija i ima veći promašaj odnosa keša od brzog sortiranja (eng.qsort).Međutim, može biti implementiran koristeći mali kod i ne koristi strukturu podataka koja skladišti informacije o aktivnim potprocedurama računarskog programa.Sortiranje po Šelu može se pozvati u programskom jeziku C iz uClibc biblioteke.Sortiranje po Šelu može se takođe servirati kao pod algoritam introspektivnog sortiranja, (eng. introspective sort), kako bi sortirao kratke podnizove i sprečio usporavanje kada rekurziona dubina prevazilazi dati limit.Ovaj princip se koristi, na primer, kod bzip2 kompresije.