Skalsorteringsalgoritm med EXEMPEL

Vad är Shell Sort

Shells metod, eller Shell-sortering i datastruktur, är en effektiv jämförelsesorteringsalgoritm på plats. Den är uppkallad efter Donald Shell när han föreslog den första idén redan 1959. Skalsortering är en generaliserad förlängning av insättningssorteringsalgoritmen.

Den grundläggande idén med denna sorteringsalgoritm är att gruppera de element som är långt ifrån varandra och sortera dem därefter. Minska sedan gradvis gapet mellan dem. Skalsortering övervinner den genomsnittliga falltidskomplexiteten för infogningssortering genom att jämföra och utbyta element som är långt borta.

Detta gap, känt som intervallet, reduceras enligt några optimala gapsekvenser. Körtiden för skalsortering är också beroende av dessa sekvenser. Det finns flera gapsekvenser, som Shells ursprungliga sekvens, Knuths formel, Hibbards inkrement, etc. Shells ursprungliga gapsekvens är – n/2, n/4, n/8, ……….1

Skalsorteringsalgoritm

Stegen eller proceduren för skalsorteringsalgoritmen är som följer-

Steg 1) Initiera intervallvärdet, h = n/2. (I det här exemplet är n storleken på arrayen)

Steg 2) Lägg alla element inom ett avstånd från intervallet h i en underlista.

Steg 3) Sortera dessa underlistor med hjälp av infogningssortering.

Steg 4) Ställ in nytt intervall, h=h/2.

Steg 5) Om h>0, gå till steg 2. Gå annars till steg 6.

Steg 6) Den resulterande utgången kommer att vara den sorterade arrayen.

Hur Shell Sortering fungerar

Vid insättningssortering flyttas element endast med en position åt gången. Tvärtom delar skalsortering upp arrayen i mindre bitar baserat på intervallvärdet och utför insättningssortering på dessa bitar.

Gradvis minskar intervallvärdet och storleken på de delade bitarna ökar. Eftersom bitarna är individuellt sorterade i förväg kräver sammanslagning av delarna färre steg än insättningssortering.

Följande GIF visar en demonstration av skalsortering. I den här demon jämförs och byts det röda och det blå värdet baserat på insättningssort. Sedan minskar intervallet, och skalsortering initierar infogningssortering i den nästan sorterade datan.

Skalsortering fungerar

Arbetar med Shell Sort Algorithm

Låt oss se ett följande exempel på en skalsorteringsalgoritm. I det här exemplet kommer vi att sortera följande array med hjälp av skalsortering:

Arbetar med Shell Sort Algorithm

Steg 1) Här är matrisstorleken 8. Således blir intervallvärdet h = 8/2 eller 4.

Steg 2) Nu kommer vi att lagra alla element på ett avstånd av 4. För vårt fall är underlistorna- {8, 1}, {6, 4}, {7, 5}, {2, 3}.

Arbetar med Shell Sort Algorithm

Steg 3) Nu kommer dessa underlistor att sorteras med hjälp av infogningssortering, där en temporär variabel används för att jämföra båda siffrorna och sortera därefter.

Arrayen skulle se ut som följande efter byte av operationer-

Arbetar med Shell Sort Algorithm

Steg 4) Nu kommer vi att minska det initiala värdet för intervallet. Det nya intervallet blir h=h/2 eller 4/2 eller 2.

Steg 5) Som 2>0 går vi till steg 2 för att lagra alla element på ett avstånd av 2. För denna tid är underlistorna-

{1, 5, 8, 7}, {4, 2, 6, 3}

Arbetar med Shell Sort Algorithm

Sedan kommer dessa underlistor att sorteras med hjälp av infogningssortering. Efter att ha jämfört och bytt ut den första underlistan blir arrayen följande.

Arbetar med Shell Sort Algorithm

Efter sortering av den andra underlistan kommer den ursprungliga arrayen att vara:

Arbetar med Shell Sort Algorithm

Sedan kommer intervallet att minskas igen. Nu kommer intervallet att vara h=h/2 eller 2/1 eller 1. Därför kommer vi att använda insättningssorteringsalgoritmen för att sortera den modifierade matrisen.

Följande är en steg-för-steg-procedurskildring av insättningssort.

Arbetar med Shell Sort Algorithm

Arbetar med Shell Sort Algorithm

Arbetar med Shell Sort Algorithm

Intervallet divideras återigen med 2. Vid det här laget blir intervallet 0. Så vi går till steg 6.

Steg 6) Eftersom intervallet är 0, sorteras matrisen efter denna tid. Den sorterade matrisen är-

Arbetar med Shell Sort Algorithm

Pseudo-kod

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

Skalsorteringsprogram i C/C++

Ingång:

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

Produktion:

Sorted Output:

1 2 3 4 5 6 7 8

Skalsorteringsexempel i Python

Ingång:

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

Produktion:

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

Tillämpningar av Shell Sort

Här är viktiga tillämpningar av Shell Sort:

  • Skalsortering används i Linuxkärnan eftersom den inte använder en samtalsstack.
  • uClibc-biblioteket använder Shell-sort.
  • bzip2-kompressorn använder Shell-sortering för att sluta överskrida rekursion.

Fördelar och nackdelar med Shell Sort

Fördelar Nackdelar
Inget stacksamtal krävs. Inte effektivt för stora arraystorlekar.
Enkel implementering. Ineffektiv för vitt spridda element.
Effektivt för mindre brett placerade element.

Skalsorteringskomplexitetsanalys

Tidskomplexitet för skalsortering

Tidskomplexiteten för skalsorteringsalgoritmen är O(n^2). Resonemanget är som följer:

För det bästa scenariot, den totala mängden tester för alla intervall när arrayen tidigare arrangerades lika med log n. Sålunda skulle komplexiteten vara O(n*log n).

För det värsta scenariot, låt oss betrakta arrayen på ett sådant sätt att elementen kräver det högsta antalet jämförelser. Då kommer inte alla element att jämföras och bytas förrän den sista iterationen. Därför är den totala jämförelsen som krävs för den slutliga ökningen O(n^2).

Sammanfattningsvis skulle tidskomplexiteten vara

  1. Bästa fallets komplexitet: O(n*log n)
  2. Genomsnittlig fallkomplexitet: O(n*log n)
  3. Komplexitet i värsta fall: O(n^2)

Körtidskomplexiteten för skalsorteringen beror mycket på de sekvenser som används för gapinkrement. Den bästa inkrementsekvensen för skalsortering är dock fortfarande okänd.

Skalsortering Space Complexity

I den här jämförelsesorten behöver vi inget extra utrymme. Alltså är rymdkomplexiteten för denna typ av algoritm O(1).

Dagligt Guru99-nyhetsbrev

Kickstarta dagen med de senaste och viktigaste AI-nyheterna som levereras just nu.