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.

Skalsortering virker

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:

Arbejde med Shell Sort Algorithm

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

Arbejde med Shell Sort Algorithm

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-

Arbejde med Shell Sort Algorithm

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}

Arbejde med Shell Sort Algorithm

Derefter sorteres disse underlister ved hjรฆlp af indsรฆttelsessortering. Efter sammenligning og ombytningping den fรธrste underliste, ville arrayet vรฆre fรธlgende.

Arbejde med Shell Sort Algorithm

Efter sortering af den anden underliste vil det originale array vรฆre:

Arbejde med Shell Sort Algorithm

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.

Arbejde med Shell Sort Algorithm

Arbejde med Shell Sort Algorithm

Arbejde med Shell Sort Algorithm

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-

Arbejde med Shell Sort Algorithm

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

  1. Bedste sagskompleksitet: O(n*log n)
  2. Gennemsnitlig sagskompleksitet: O(n*log n)
  3. 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).

Opsummer dette indlรฆg med: