Shell-lajittelualgoritmi esimerkin kanssa

โšก ร„lykรคs yhteenveto

Shell Sort on paikallisesti toimiva vertailualgoritmi, joka yleistรครค lisรคyslajittelun vertaamalla kaukana toisistaan โ€‹โ€‹olevia elementtejรค ja pienentรคmรคllรค sitten rakoa, kunnes vierekkรคiset elementit on lajiteltu.

  • ๐Ÿ“Š Mรครคritelmรค: Donald Shellin vuonna 1959 ehdottama yleistys lisรคyslajittelulle, joka kรคyttรครค vรคhenevรครค rakosekvenssiรค.
  • ๐Ÿ”€ Aukkosekvenssit: Shellin alkuperรคinen lauseke on n/2, n/4, โ€ฆ, 1; Knuthin, Sedgewickin ja Ciuran sekvenssit toimivat kรคytรคnnรถssรค paremmin.
  • โšก Monimutkaisuus: O(n log n) paras tapaus, O(n^2) huonoin tapaus ja O(1) aputila.
  • โœ… Kรคytรค koteloita: Linux-ydin, uClibc ja bzip2 kรคyttรคvรคt Shell Sort -menetelmรครค rekursion ja ylimรครคrรคisen pinomuistin vรคlttรคmiseksi.
  • ๐Ÿค– Tekoรคlyn kulma: Tekoรคlyavustajat voivat ehdottaa aukkosarjoja ja luoda animoituja Shell Sort -visualisointeja pyynnรถstรค.

Mikรค on kuoren lajittelu?

Shell Sort, joka tunnetaan myรถs Shellin menetelmรคnรค, on tehokas vertailuun perustuva lajittelualgoritmi. Se on nimetty Donald Shellin mukaan, joka esitteli idean vuonna 1959. Se on yleistetty lisรคyslajittelun laajennus, joka ratkaisee sen neliรถllisen kรคyttรคytymisen hajallaan olevassa datassa.

Perusajatuksena on ryhmitellรค kaukana toisistaan โ€‹โ€‹olevat elementit, lajitella jokainen ryhmรค lisรคyslajittelulla ja pienentรครค rakoa askel askeleelta, kunnes se saavuttaa yhden. Tรคllรถin taulukko on lรคhes lajiteltu.

Tรคmรค aukko, intervalli, seuraa valittua jรคrjestystรค, kuten Shellin alkuperรคinen, Knuthin, Hibbardin tai Sedgewickin. Shellin alkuperรคinen on n/2, n/4, ..., 1.

Shell-lajittelualgoritmi

Vaihe 1) Alusta vรคlin arvo h = n/2, jossa n on taulukon koko.

Vaihe 2) Sijoita kaikki vรคlin h etรคisyydellรค olevat elementit alilistaan.

Vaihe 3) Lajittele jokainen alilista lisรคyslajittelun avulla.

Vaihe 4) Aseta uusi aikavรคli h = h/2.

Vaihe 5) Jos h > 0, palaa vaiheeseen 2. Muussa tapauksessa siirry vaiheeseen 6.

Vaihe 6) Tuloksena oleva taulukko on nyt tรคysin lajiteltu.

Kuinka Shell-lajittelu toimii

Lisรคyslajittelussa elementit liikkuvat vain yhden sijainnin kerrallaan. Shell Sort jakaa taulukon harvaan sijoitettuihin alilistoihin aikavรคlin perusteella ja suorittaa lisรคyslajittelun jokaiselle alilistalle.

Vรคlin kutistuessa alilistan koko kasvaa. Koska aiemmat suoritukset jรคttรคvรคt tiedot osittain lajiteltuina, lyhyemmรคt vรคlit vaativat paljon vรคhemmรคn vaihtoja kuin lisรคyslaji alusta alkaen. Alla oleva kuva havainnollistaa yhtรค Shell Sort -vaihetta.

Shell lajittelu toimii

Shell-lajittelualgoritmin toiminta esimerkin avulla

Lajitellaan alla oleva taulukko Shell Sort -menetelmรคllรค.

Shell-lajittelualgoritmin toiminta

Vaihe 1) Taulukon koko on 8, joten alkuarvon vรคli on h = 8/2 = 4.

Vaihe 2) Ryhmittele elementit neljรคn sijainnin vรคlein. Alilistat: {8, 1}, {6, 4}, {7, 5}, {2, 3}.

Shell-lajittelualgoritmin toiminta

Vaihe 3) Lajittele jokainen alilista lisรคyslajittelun avulla. Vรคliaikainen muuttuja sรคilyttรครค sijoitettavaa arvoa elementtien siirtyessรค. Vaihtojen jรคlkeen taulukko nรคyttรครค tรคltรค.

Shell-lajittelualgoritmin toiminta

Vaihe 4) Pienennรค vรคliรค. Uusi vรคli on h = 4/2 = 2.

Vaihe 5) Koska 2 > 0, palaa vaiheeseen 2 ja ryhmittele elementit kahden aseman pรครคhรคn toisistaan: {1, 5, 8, 7} ja {4, 2, 6, 3}.

Shell-lajittelualgoritmin toiminta

Lajittele ensimmรคinen alilista. Taulukosta tulee:

Shell-lajittelualgoritmin toiminta

Toisen alilistan lajittelun jรคlkeen:

Shell-lajittelualgoritmin toiminta

Pienennรค vรคliรค uudelleen arvoon h = 2/2 = 1. Yhden aukon ollessa Shell Sort suorittaa viimeisen lisรคyslajittelun koko taulukon yli, kuten alla on esitetty.

Shell-lajittelualgoritmin toiminta

Shell-lajittelualgoritmin toiminta

Shell-lajittelualgoritmin toiminta

Vaihe 6) Vรคlin jakaminen uudelleen antaa tulokseksi 0. Taulukko on nyt tรคysin lajiteltu:

Shell-lajittelualgoritmin toiminta

Pseudo-Code Shell Sort -sovellukselle

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 lajitteluohjelma C/C++

input:

//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";
}

lรคhtรถ:

Sorted Output:

1 2 3 4 5 6 7 8

Shell Lajittelu esimerkki sisรครคn Python

input:

#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)

lรคhtรถ:

Sorted Output:
[1, 2, 3, 4, 5, 6, 7, 8]

Shell-lajittelun sovellukset

Shell Sort -menetelmรครค esiintyy edelleen nykyaikaisissa jรคrjestelmissรค, joissa pinotila tai yksinkertaisuus ovat tรคrkeitรค.

  • Linux-ytimen kรคyttรครค Shell Sort -menetelmรครค paikoissa, joissa kutsupinon vรคlttรคminen on tรคrkeรครค.
  • uClibc:n upotettu C-kirjasto kรคyttรครค Shell Sort -ominaisuutta muistin kรคytรถn pitรคmiseksi alhaisena.
  • bzip2 kรคyttรครค Shell Sort -menetelmรครค vรคlttรครคkseen syvรคn rekursion lohkolajittelun aikana.
  • Sulautettu laiteohjelmisto suosii Shell Sort -menetelmรครค pienille tietojoukoille, joissa rekursio on rajoitettua.

Shell Lajittelun edut ja haitat

edut Haitat
Kutsupinoa ei tarvita, mikรค on ihanteellista sulautetuille jรคrjestelmille. Ei nopein vaihtoehto erittรคin suurille taulukoille.
Helppo toteuttaa pienellรค mรครคrรคllรค koodia. Suorituskyky heikkenee datassa, jossa on laajalti hajallaan olevia elementtejรค.
Tehokas keskikokoisille tai osittain lajitelluille matriiseille. Pahimman tapauksen aikakompleksisuus on herkkรค valitulle aukkosekvenssille.
Toimii paikallaan, joten se kรคyttรครค jatkuvaa apumuistia. Se ei ole vakaa lajittelu, joten yhtรคsuuret avaimet voivat muuttaa suhteellista jรคrjestystรค.

Shell Lajittelun monimutkaisuusanalyysi

Shell-lajittelun aika monimutkaisuus

Shell Sort -menetelmรคn aikavaativuus riippuu kรคytetystรค aukkosekvenssistรค.

Parhaassa tapauksessa, kun taulukko on jo lรคhes jรคrjestetty, jokainen lรคpimenokerta tarvitsee vain logaritmisen mรครคrรคn testejรค, jolloin saadaan O(n log n).

Pahimmassa tapauksessa taulukko on jรคrjestetty siten, ettรค alkiot tarvitsevat maksimaaliset vertailut ja lopullinen lisรคys on hallitseva kohdassa O(n^2) Shellin alkuperรคisellรค sekvenssillรค.

  1. Parhaan tapauksen kompleksisuus: O(n log n)
  2. Keskimรครคrรคinen tapauskompleksisuus: O(n log n) - O(n^(4/3)) riippuen aukkosekvenssistรค
  3. Pahimman tapauksen monimutkaisuus: O(n^2) Shellin alkuperรคisellรค sekvenssillรค

Paras yleiskรคyttรถinen aukkosekvenssi on edelleen avoin tutkimuskysymys, vaikka Sedgewickin ja Ciuran sekvenssit toimivat kรคytรคnnรถssรค hyvin.

Shell lajittelutilan monimutkaisuus

Shell Sort ei vaadi aputaulukoita, joten avaruuskompleksisuus on O(1) syรถtteen koosta riippumatta, mikรค on yksi sen vahvimmista kรคytรคnnรถn eduista.

UKK

Shell Sort on Donald Shellin vuonna 1959 ehdottama vertailulajittelualgoritmi. Se yleistรครค lisรคyslajittelun vertaamalla kaukana toisistaan โ€‹โ€‹olevia elementtejรค ja pienentรคmรคllรค sitten rakoa, kunnes vierekkรคiset elementit on lajiteltu, mikรค vรคhentรครค dramaattisesti vaihtojen mรครคrรครค.

Parhaan tapauksen aikakompleksisuus on O(n log n) ja pahimman tapauksen kompleksisuus on O(n^2) Shellin alkuperรคisellรค sekvenssillรค. Paremmat aukkokompleksisuussekvenssit, kuten Sedgewickin sekvenssi, pienentรคvรคt pahimman tapauksen noin arvoon O(n^(4/3)). Avaruuskompleksisuus on O(1).

Ei, Shell-lajittelu ei ole vakaa. Koska elementtejรค vertaillaan ja vaihdetaan pitkien aukkojen yli, kahden samanlaisen avaimen suhteellinen jรคrjestys voi muuttua suorituksen aikana. Jos vakaus on tรคrkeรครค, kรคytรค yhdistรคmislajittelua tai lisรคyslajittelun vakaata muunnosta.

Lisรคyslajittelu siirtรครค elementtejรค yhden sijainnin kerrallaan. Kuorilajittelu vertaa ensin kaukana toisistaan โ€‹โ€‹olevia elementtejรค ja pienentรครค sitten asteittain vรคliรค. Tuloksena on lรคhes lajiteltu taulukko, kun vรคli saavuttaa yhden, joten viimeinen lisรคyslajitteluvaihe pรครคttyy hyvin nopeasti.

Tekoรคlyavustajat voivat analysoida tietojoukkosi koon, jakauman ja rajoitteet ja suositella sitten algoritmia, kuten Shell Sort, quicksort tai radix sort. Ne voivat myรถs luoda vertailukomentosarjoja, jotka vertailevat suorituksenaikaista ja muistin kรคyttรถรค, jotta voit validoida suosituksen todellisilla tyรถkuormilla.

Kyllรค. Tekoรคlytyรถkalut voivat luoda animoituja visualisointeja Shell Sort -menetelmรคstรค, jotka korostavat aukkoryhmiรค, vertailuja ja vaihtoja reaaliajassa. Tรคllaiset visualisoinnit auttavat oppijoita nรคkemรครคn, kuinka vรคli kutistuu ja kuinka taulukko konvergoituu kohti lajiteltua tilaa kierrokselta.

Tiivistรค tรคmรค viesti seuraavasti: