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.

  • ๐Ÿ“Š Definicija: Generalizacija sortiranja umetanjem na mjestu koju je predloลพio Donald Shell 1959. godine, a koja koristi opadajuฤ‡u sekvencu praznina.
  • ๐Ÿ”€ Sekvence praznina: Shellov original je n/2, n/4, โ€ฆ, 1; Knuthov, Sedgewickov i Ciurin niz se bolje pokazuju u praksi.
  • โšก Sloลพenost: O(n log n) najbolji sluฤaj, O(n^2) najgori sluฤaj i O(1) pomoฤ‡ni prostor.
  • โœ… Upotrijebite sluฤajeve: Linux kernel, uClibc i bzip2 koriste Shell Sort kako bi izbjegli rekurziju i dodatnu memoriju na stogu.
  • ๐Ÿค– Kut umjetne inteligencije: AI asistenti mogu predlagati nizove praznina i generirati animirane vizualizacije Shell sortiranja na zahtjev.

ล 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.

Shell Sort radi

Rad algoritma Shell sortiranja s primjerom

Sortirajmo niz ispod koristeฤ‡i Shell Sort.

Rad algoritma sortiranja ljuske

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}.

Rad algoritma sortiranja ljuske

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.

Rad algoritma sortiranja ljuske

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}.

Rad algoritma sortiranja ljuske

Sortiraj prvu podlistu. Niz postaje:

Rad algoritma sortiranja ljuske

Nakon sortiranja druge podliste:

Rad algoritma sortiranja ljuske

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.

Rad algoritma sortiranja ljuske

Rad algoritma sortiranja ljuske

Rad algoritma sortiranja ljuske

Korak 6) Ponovno dijeljenje intervala daje 0. Niz je sada potpuno sortiran:

Rad algoritma sortiranja ljuske

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.

  1. Sloลพenost u najboljem sluฤaju: O(n log n)
  2. Prosjeฤna sloลพenost sluฤaja: od O(n log n) do O(n^(4/3)) ovisno o nizu praznina
  3. 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.

Pitanja i odgovori

Shell Sort je algoritam sortiranja usporedbom na mjestu koji je predloลพio Donald Shell 1959. godine. Generalizira sortiranje umetanjem usporeฤ‘ujuฤ‡i elemente koji su meฤ‘usobno udaljeni, a zatim smanjujuฤ‡i razmak dok se susjedni elementi ne sortiraju, ลกto dramatiฤno smanjuje broj zamjena.

Vremenska sloลพenost u najboljem sluฤaju je O(n log n), a sloลพenost u najgorem sluฤaju je O(n^2) s Shellovim originalnim nizom. Bolji nizovi s prazninama poput Sedgewickovog smanjuju najgori sluฤaj na otprilike O(n^(4/3)). Prostorna sloลพenost je O(1).

Ne, Shell sortiranje nije stabilno. Buduฤ‡i da se elementi usporeฤ‘uju i zamjenjuju preko velikih praznina, dva jednaka kljuฤa mogu promijeniti relativni redoslijed tijekom prolaza. Ako je stabilnost vaลพna, umjesto toga koristite sortiranje spajanjem ili stabilnu varijantu sortiranja umetanjem.

Sortiranje umetanjem pomiฤe elemente jednu poziciju odjednom. Shell sortiranje prvo usporeฤ‘uje elemente koji su daleko jedan od drugoga, a zatim progresivno smanjuje razmak. Rezultat je gotovo sortiran niz do trenutka kada razmak dosegne jedan, tako da zavrลกni prolaz sortiranja umetanjem zavrลกava vrlo brzo.

AI asistenti mogu analizirati veliฤinu, distribuciju i ograniฤenja vaลกeg skupa podataka, a zatim preporuฤiti algoritam kao ลกto je Shell Sort, Quicksort ili Radix Sort. Takoฤ‘er mogu generirati benchmark skripte koje usporeฤ‘uju vrijeme izvoฤ‘enja i koriลกtenje memorije kako biste mogli provjeriti preporuku na stvarnim optereฤ‡enjima.

Da. Alati umjetne inteligencije mogu generirati animirane vizualizacije Shell sortiranja koje istiฤu grupe praznina, usporedbe i zamjene u stvarnom vremenu. Takve vizualizacije pomaลพu uฤenicima da vide kako se interval smanjuje i kako niz konvergira prema sortiranom stanju prolaz za prolazom.

Saลพmite ovu objavu uz: