Shell sort algoritam s primjerom
โก Pametni saลพetak
Shell sort je algoritam za usporedbu na mjestu koji generalizira sortiranje umetanjem usporeฤujuฤi elemente koji su daleko jedan od drugoga, a zatim smanjujuฤi razmak dok se susjedni elementi ne sortiraju.

ล to je Shell sortiranje?
Shellovo sortiranje, takoฤer nazvano Shellovom metodom, uฤinkovit je algoritam sortiranja temeljen na usporedbi na mjestu. Nazvan po Donaldu Shellu, koji je predstavio tu ideju 1959. godine, to je generalizirano proลกirenje sortiranja umetanjem koje prevladava njegovo kvadratno ponaลกanje na rasprลกenim podacima.
Temeljna ideja je grupirati elemente koji su meฤusobno udaljeni, sortirati svaku grupu pomoฤu sortiranja umetanjem i smanjivati โโrazmak korak po korak dok ne dosegne jedan. Do tada je niz gotovo sortiran.
Ovaj razmak, interval, slijedi odabrani slijed kao ลกto je Shellov original, Knuthov, Hibbardov ili Sedgewickov. Shellov original je n/2, n/4, ..., 1.
Algoritam sortiranja ljuske
Korak 1) Inicijalizirajte vrijednost intervala h = n/2, gdje je n veliฤina polja.
Korak 2) Smjestite sve elemente unutar udaljenosti intervala h u podlistu.
Korak 3) Sortiraj svaku podlistu koristeฤi sortiranje umetanjem.
Korak 4) Postavi novi interval h = h/2.
Korak 5) Ako je h > 0, vratite se na korak 2. U suprotnom, idite na korak 6.
Korak 6) Rezultirajuฤi niz je sada potpuno sortiran.
Kako Shell Sort radi
U sortiranju umetanjem, elementi se pomiฤu samo za jednu poziciju odjednom. Shell sortiranje umjesto toga dijeli niz na ลกiroko razmaknute podliste na temelju intervala i izvodi sortiranje umetanjem na svakoj podlisti.
Kako se interval smanjuje, veliฤina podliste raste. Buduฤi da raniji prolazi ostavljaju podatke djelomiฤno sortiranima, manji intervali zahtijevaju puno manje zamjena nego izvoฤenje umetanje sortirati od nule. Donja slika ilustrira jedan prolaz Shell sortiranja.
Rad algoritma Shell sortiranja s primjerom
Sortirajmo niz ispod koristeฤi Shell Sort.
Korak 1) Veliฤina polja je 8, pa je poฤetna vrijednost intervala h = 8/2 = 4.
Korak 2) Grupiraj elemente s razmakom od ฤetiri pozicije. Podliste: {8, 1}, {6, 4}, {7, 5}, {2, 3}.
Korak 3) Sortirajte svaku podlistu pomoฤu sortiranja umetanjem. Privremena varijabla sadrลพi vrijednost koja se postavlja dok se elementi pomiฤu. Nakon zamjena, niz izgleda ovako.
Korak 4) Smanjite interval. Novi interval je h = 4/2 = 2.
Korak 5) Buduฤi da je 2 > 0, vratite se na korak 2 i grupirajte elemente s razmakom od dvije pozicije: {1, 5, 8, 7} i {4, 2, 6, 3}.
Sortiraj prvu podlistu. Niz postaje:
Nakon sortiranja druge podliste:
Ponovno smanjite interval na h = 2/2 = 1. S razmakom od jedan, Shell Sort izvrลกava zavrลกni prolaz sortiranja umetanjem preko cijelog polja, kao ลกto je prikazano dolje.
Korak 6) Ponovno dijeljenje intervala daje 0. Niz je sada potpuno sortiran:
Pseudo-Code za Shell sortiranje
Start Input array a of size n for (interval = n / 2; interval > 0; interval /= 2) for (i = interval; i < n; i += 1) temp = a[i]; for (j = i; j >= interval && a[j - interval] > temp; j -= interval) a[j] = a[j - interval]; a[j] = temp; End
Shell Sort Program u C/C++
Ulazni:
//Shell Sort Program in C/C++ #include <bits/stdc++.h> using namespace std; void ShellSort(int data[], int size) { for (int interval = size / 2; interval > 0; interval /= 2) { for (int i = interval; i < size; i += 1) { int temp = data[i]; int j; for (j = i; j >= interval && data[j - interval] > temp; j -= interval) { data[j] = data[j - interval]; } data[j] = temp; } } } int main() { int data[] = {8, 6, 7, 2, 1, 4, 5, 3}; int size = sizeof(data) / sizeof(data[0]); ShellSort(data, size); cout << "Sorted Output: \n"; for (int i = 0; i < size; i++) cout << data[i] << " "; cout << "\n"; }
Izlaz:
Sorted Output:
1 2 3 4 5 6 7 8
Shell Sort Primjer u Python
Ulazni:
#Shell Sort Example in Python def ShellSort(data, size): interval = size // 2 while interval > 0: for i in range(interval, size): temp = data[i] j = i while j >= interval and data[j - interval] > temp: data[j] = data[j - interval] j -= interval data[j] = temp interval //= 2 data = [8, 6, 7, 2, 1, 4, 5, 3] ShellSort(data, len(data)) print('Sorted Output:') print(data)
Izlaz:
Sorted Output:
[1, 2, 3, 4, 5, 6, 7, 8]
Primjene Shell Sort
Shell sortiranje se joลก uvijek pojavljuje u modernim sustavima gdje su prostor na stoga ili jednostavnost vaลพni.
- The Linux kernel koristi Shell Sort na mjestima gdje je vaลพno izbjegavanje steka poziva.
- Ugraฤena C biblioteka uClibc koristi Shell Sort kako bi koriลกtenje memorije bilo ลกto kraฤe.
- bzip2 koristi Shell Sort kako bi izbjegao duboku rekurziju tijekom sortiranja blokova.
- Ugraฤeni firmware favorizira Shell Sort za male skupove podataka gdje je rekurzija ograniฤena.
Prednosti i nedostaci Shell sortiranja
| Prednosti | Nedostaci |
|---|---|
| Nije potreban stek poziva, ลกto je idealno za ugraฤene sustave. | Nije najbrลพa opcija za vrlo velike nizove. |
| Jednostavno za implementaciju s malom koliฤinom koda. | Performanse se smanjuju na podacima s ลกiroko rasprostranjenim elementima. |
| Uฤinkovito za umjereno velike ili djelomiฤno sortirane nizove. | Vremenska sloลพenost u najgorem sluฤaju osjetljiva je na odabrani niz praznina. |
| Radi na mjestu, pa koristi stalnu pomoฤnu memoriju. | Nije stabilna sorta, pa jednaki kljuฤevi mogu promijeniti relativni redoslijed. |
Shell Sort Complexity Analiza
Vremenska sloลพenost shell sortiranja
Vremenska sloลพenost Shell sortiranja ovisi o koriลกtenom nizu praznina.
U najboljem sluฤaju, kada je niz veฤ gotovo posloลพen, svaki prolaz zahtijeva samo logaritamski broj testova, ลกto daje O(n log n).
U najgorem sluฤaju, niz je ureฤen tako da elementi trebaju maksimalan broj usporedbi, a konaฤni prirast dominira na O(n^2) s Shell-ovim originalnim nizom.
- Sloลพenost u najboljem sluฤaju: O(n log n)
- Prosjeฤna sloลพenost sluฤaja: od O(n log n) do O(n^(4/3)) ovisno o nizu praznina
- Sloลพenost u najgorem sluฤaju: O(n^2) s Shellovim originalnim nizom
Najbolji niz opฤe namjene za gap je joลก uvijek otvoreno istraลพivaฤko pitanje, iako Sedgewickov i Ciura niz dobro funkcioniraju u praksi.
Shell Sort Space Complexity
Shell sortiranje ne zahtijeva pomoฤne nizove, pa je prostorna sloลพenost O(1) bez obzira na veliฤinu ulaza, ลกto je jedna od njegovih najjaฤih praktiฤnih prednosti.










