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.

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-lajittelualgoritmin toiminta esimerkin avulla
Lajitellaan alla oleva taulukko Shell Sort -menetelmรคllรค.
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}.
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รค.
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}.
Lajittele ensimmรคinen alilista. Taulukosta tulee:
Toisen alilistan lajittelun jรคlkeen:
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.
Vaihe 6) Vรคlin jakaminen uudelleen antaa tulokseksi 0. Taulukko on nyt tรคysin lajiteltu:
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รค.
- Parhaan tapauksen kompleksisuus: O(n log n)
- Keskimรครคrรคinen tapauskompleksisuus: O(n log n) - O(n^(4/3)) riippuen aukkosekvenssistรค
- 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.










