Skalsorteringsalgoritme med EKSEMPEL
Hvad er Shell Sort
Shells metode, eller Shell-sortering i datastruktur, er en effektiv in-place-sammenligningssorteringsalgoritme. Den er opkaldt efter Donald Shell, da han foreslog den oprindelige idรฉ tilbage i 1959. Shell-sortering er en generaliseret udvidelse af indsรฆttelsessorteringsalgoritmen.
Den grundlรฆggende idรฉ med denne sorteringsalgoritme er at gruppere de elementer, der er langt fra hinanden, og sortere dem i overensstemmelse hermed. Formindsk derefter gradvist afstanden mellem dem. Shell-sortering overvinder den gennemsnitlige sagstidskompleksitet af indsรฆttelsessortering ved at sammenligne og udveksle elementer, der er langt vรฆk.
Dette mellemrum, kendt som intervallet, reduceres i henhold til nogle optimale mellemrumssekvenser. Kรธretiden for skalsortering er ogsรฅ afhรฆngig af disse sekvenser. Der er flere mellemrumssekvenser, sรฅsom Shells oprindelige sekvens, Knuths formel, Hibbards intervaller osv. Shells oprindelige mellemrumssekvens er โ n/2, n/4, n/8, โฆโฆโฆ.1
Skalsorteringsalgoritme
Trinene eller proceduren for shellsorteringsalgoritmen er som fรธlger-
Trin 1) Initialiser intervalvรฆrdien, h = n/2. (I dette eksempel er n stรธrrelsen af โโarrayet)
Trin 2) Sรฆt alle elementer inden for en afstand af intervallet h i en underliste.
Trin 3) Sorter disse underlister ved hjรฆlp af indsรฆttelsessortering.
Trin 4) Indstil nyt interval, h=h/2.
Trin 5) Hvis h>0, gรฅ til trin 2. Ellers gรฅ til trin 6.
Trin 6) Det resulterende output vil vรฆre det sorterede array.
Sรฅdan fungerer Shell-sortering
Ved indsรฆttelsessortering flyttes elementer kun med รฉn position ad gangen. Tvรฆrtimod opdeler shell-sortering arrayet i mindre stykker baseret pรฅ intervalvรฆrdien og udfรธrer indsรฆttelsessortering pรฅ disse stykker.
Gradvist falder intervalvรฆrdien, og de opdelte stykkers stรธrrelse รธges. Da stykkerne er sorteret individuelt pรฅ forhรฅnd, krรฆver det fรฆrre trin at fusionere disse stykker end indsรฆtnings sortering.
Fรธlgende GIF viser en demonstration af skalsortering. I denne demo sammenlignes og byttes den rรธde og den blรฅ angivne vรฆrdi baseret pรฅ indsรฆttelsessortering. Sรฅ falder intervallet, og shell-sortering starter indsรฆttelsessortering i de nรฆsten sorterede data.
Arbejde med Shell Sort Algorithm
Lad os se et fรธlgende eksempel pรฅ en shell-sorteringsalgoritme. I dette eksempel vil vi sortere fรธlgende array ved hjรฆlp af shell sort:
Trin 1) Her er matrixstรธrrelsen 8. Intervalvรฆrdien vil sรฅledes vรฆre h = 8/2 eller 4.
Trin 2) Nu vil vi gemme alle elementer i en afstand pรฅ 4. For vores tilfรฆlde er underlisterne- {8, 1}, {6, 4}, {7, 5}, {2, 3}.
Trin 3) Nu vil disse underlister blive sorteret ved hjรฆlp af indsรฆttelsessortering, hvor en midlertidig variabel bruges til at sammenligne bรฅde tal og sortere i overensstemmelse hermed.
Arrayet ville se sรฅdan ud efter swapping operationer-
Trin 4) Nu vil vi mindske startvรฆrdien af โโintervallet. Det nye interval vil vรฆre h=h/2 eller 4/2 eller 2.
Trin 5) Som 2>0 vil vi gรฅ til trin 2 for at gemme alle elementer i en afstand pรฅ 2. For denne gang er underlisterne-
{1, 5, 8, 7}, {4, 2, 6, 3}
Derefter sorteres disse underlister ved hjรฆlp af indsรฆttelsessortering. Efter sammenligning og ombytningping den fรธrste underliste, ville arrayet vรฆre fรธlgende.
Efter sortering af den anden underliste vil det originale array vรฆre:
Sรฅ igen vil intervallet blive reduceret. Nu vil intervallet vรฆre h=h/2 eller 2/1 eller 1. Derfor vil vi bruge indsรฆttelsessorteringsalgoritmen til at sortere det modificerede array.
Fรธlgende er den trinvise proceduremรฆssige afbildning af indsรฆttelsessort.
Intervallet divideres igen med 2. Pรฅ dette tidspunkt bliver intervallet 0. Sรฅ vi gรฅr til trin 6.
Trin 6) Da intervallet er 0, er arrayet sorteret efter dette tidspunkt. Det sorterede array er-
pseudoCode
Start
Input array an of size n
for (interval = n / 2; interval & gt; 0; interval /= 2)
for (i = interval; i & lt; n; i += 1)
temp = a[i];
for (j = i; j & gt; = interval & amp; & amp; a[j - interval] & gt; temp; j -= interval)
a[j] = a[j - interval];
a[j] = temp;
End
Shell Sorteringsprogram i 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";
}
Output:
Sorted Output: 1 2 3 4 5 6 7 8
Shell Sortering Eksempel i 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)
Output:
Sorted Output: [1, 2, 3, 4, 5, 6, 7, 8]
Anvendelser af Shell Sort
Her er vigtige anvendelser af Shell Sort:
- Skalsortering bruges i Linux-kernen fordi den ikke bruger en opkaldsstak.
- uClibc-biblioteket bruger Shell-sortering.
- bzip2-kompressor bruger Shell-sortering til at stoppe overskridelse af rekursion.
Fordele og ulemper ved Shell Sort
| Fordele | Ulemper |
|---|---|
| Intet stackkald er pรฅkrรฆvet. | Ikke effektiv til store matrixstรธrrelser. |
| Nem implementering. | Ineffektiv til vidt udbredte elementer. |
| Effektiv til elementer med mindre afstand. |
Shell Sort kompleksitetsanalyse
Tidskompleksitet af Shell-sortering
Tidskompleksiteten af โโskalsorteringsalgoritmen er O(n^2). Begrundelsen er som fรธlger:
For det bedste tilfรฆlde er den samlede mรฆngde af tests for alle intervaller, nรฅr arrayet tidligere var arrangeret lig med log n. Sรฅledes ville kompleksiteten vรฆre O(n*log n).
For det vรฆrst tรฆnkelige scenarie, lad os overveje, at arrayet bestรฅr pรฅ en sรฅdan mรฅde, at elementerne krรฆver det hรธjeste antal sammenligninger. Sรฅ vil alle elementer ikke blive sammenlignet og รฆndret fรธr den sidste iteration. Derfor er de samlede sammenligninger, der krรฆves for den endelige stigning, O(n^2).
Afslutningsvis ville tidskompleksiteten vรฆre
- Bedste sagskompleksitet: O(n*log n)
- Gennemsnitlig sagskompleksitet: O(n*log n)
- Vรฆrste tilfรฆlde kompleksitet: O(n^2)
Kรธretidskompleksiteten af โโshell-sortering afhรฆnger i hรธj grad af de anvendte gap-inkrementersekvenser. Den bedste trinsekvens for skalsortering er dog stadig ukendt.
Shell Sort Space kompleksitet
I denne sammenligningstype har vi ikke brug for yderligere ekstra plads. Rumkompleksiteten af โโdenne slags algoritme er sรฅledes O(1).










