logo

Shell-sorteeralgoritme

In dit artikel bespreken we het shell-sorteeralgoritme. Shell-soort is de generalisatie van invoeg-soort, die de nadelen van invoeg-soort overwint door elementen te vergelijken die gescheiden zijn door een opening van verschillende posities.

Het is een sorteeralgoritme dat een uitgebreide versie is van invoegsortering. Shell-sortering heeft de gemiddelde tijdcomplexiteit van invoegsortering verbeterd. Net als bij invoegsortering is het een op vergelijkingen gebaseerd en ter plaatse sorteeralgoritme. Shell-sortering is efficiënt voor middelgrote datasets.

Bij invoegsortering kunnen elementen slechts één positie vooruit worden verplaatst. Om een ​​element naar een verre positie te verplaatsen zijn veel bewegingen nodig die de uitvoeringstijd van het algoritme vergroten. Maar shell-sortering overwint dit nadeel van insertie-sortering. Het maakt ook het verplaatsen en verwisselen van verre elementen mogelijk.

Dit algoritme sorteert eerst de elementen die ver van elkaar verwijderd zijn, en verkleint vervolgens de kloof ertussen. Deze kloof wordt genoemd als interval. Dit interval kan worden berekend met behulp van de Knuth's onderstaande formule -

 h = h * 3 + 1 where, 'h' is the interval having initial value 1. 

Laten we nu eens kijken naar het algoritme van shell-sortering.

Algoritme

De eenvoudige stappen voor het bereiken van de shell-sortering worden als volgt weergegeven:

 ShellSort(a, n) // &apos;a&apos; is the given array, &apos;n&apos; is the size of array for (interval = n/2; interval &gt; 0; interval /= 2) for ( i = interval; i <n; i +="1)" temp="a[i];" for (j="i;" j>= interval &amp;&amp; a[j - interval] &gt; temp; j -= interval) a[j] = a[j - interval]; a[j] = temp; End ShellSort </n;>

Werking van het Shell-soortalgoritme

Laten we nu eens kijken naar de werking van het shell-sorteeralgoritme.

Om de werking van het shell-sorteeralgoritme te begrijpen, nemen we een ongesorteerde array. Het zal gemakkelijker zijn om de shell-sortering te begrijpen aan de hand van een voorbeeld.

Laat de elementen van array zijn -

Shell-sorteeralgoritme

We zullen de originele volgorde van shell-sortering gebruiken, d.w.z. N/2, N/4,...,1 als de intervallen.

In de eerste lus is n gelijk aan 8 (grootte van de array), dus de elementen liggen op het interval van 4 (n/2 = 4). Elementen worden vergeleken en verwisseld als ze niet in orde zijn.

Hier, in de eerste lus, het element op 0epositie wordt vergeleken met het element op 4epositie. Als de 0eelement groter is, wordt het verwisseld met het element op 4epositie. Anders blijft het hetzelfde. Dit proces zal doorgaan voor de overige elementen.

Met een interval van 4 zijn de sublijsten {33, 12}, {31, 17}, {40, 25}, {8, 42}.

Shell-sorteeralgoritme

Nu moeten we de waarden in elke sublijst vergelijken. Na het vergelijken moeten we ze indien nodig in de originele array omwisselen. Na het vergelijken en omwisselen ziet de bijgewerkte array er als volgt uit:

Shell-sorteeralgoritme

In de tweede lus liggen de elementen op het interval van 2 (n/4 = 2), waarbij n = 8.

Nu nemen we het interval van 2 om de rest van de array te sorteren. Met een interval van 2 worden er twee sublijsten gegenereerd: {12, 25, 33, 40} en {17, 8, 31, 42}.

Shell-sorteeralgoritme

Nu moeten we opnieuw de waarden in elke sublijst vergelijken. Na het vergelijken moeten we ze indien nodig in de originele array omwisselen. Na het vergelijken en omwisselen ziet de bijgewerkte array er als volgt uit:

Shell-sorteeralgoritme

In de derde lus liggen de elementen op het interval van 1 (n/8 = 1), waarbij n = 8. Ten slotte gebruiken we het interval van waarde 1 om de rest van de array-elementen te sorteren. In deze stap gebruikt shell-sortering invoegsortering om de array-elementen te sorteren.

Shell-sorteeralgoritme

Nu wordt de array in oplopende volgorde gesorteerd.

Complexiteit van shell-sortering

Laten we nu eens kijken naar de tijdscomplexiteit van Shell, in het beste geval, het gemiddelde geval en het slechtste geval. We zullen ook de ruimtecomplexiteit van het Shell-type zien.

1. Tijdcomplexiteit

Geval Tijdcomplexiteit
Beste geval O(n*loggen)
Gemiddeld geval O(n*log(n)2)
Het slechtste geval Op2)
    Beste case-complexiteit -Het treedt op als er geen sortering vereist is, d.w.z. de array is al gesorteerd. De beste tijdcomplexiteit van Shell-soort is O(n*loggen). Gemiddelde casuscomplexiteit -Het treedt op wanneer de array-elementen zich in een door elkaar geplaatste volgorde bevinden die niet goed oplopend en niet goed aflopend is. De gemiddelde case-time-complexiteit van Shell-soort is O(n*loggen). In het ergste geval complexiteit -Het treedt op wanneer de array-elementen in omgekeerde volgorde moeten worden gesorteerd. Dat betekent dat u de array-elementen in oplopende volgorde moet sorteren, maar de elementen ervan in aflopende volgorde. De worst-case tijdcomplexiteit van Shell is dat wel Op2).

2. Ruimtecomplexiteit

Ruimtecomplexiteit O(1)
Stal NEE
  • De ruimtecomplexiteit van Shell-soort is O(1).

Implementatie van Shell-soort

Laten we nu eens kijken hoe de programma's van Shell in verschillende programmeertalen worden gesorteerd.

Programma: Schrijf een programma om Shell sort in C-taal te implementeren.

 #include /* function to implement shellSort */ int shell(int a[], int n) { /* Rearrange the array elements at n/2, n/4, ..., 1 intervals */ for (int interval = n/2; interval &gt; 0; interval /= 2) { for (int i = interval; i <n; i +="1)" { * store a[i] to the variable temp and make ith position empty int j; for (j="i;" j>= interval &amp;&amp; a[j - interval] &gt; temp; j -= interval) a[j] = a[j - interval]; // put temp (the original a[i]) in its correct position a[j] = temp; } } return 0; } void printArr(int a[], int n) /* function to print the array elements */ { int i; for (i = 0; i <n; 42 i++) printf('%d ', a[i]); } int main() { a[]="{" 33, 31, 40, 8, 12, 17, 25, }; n="sizeof(a)" sizeof(a[0]); printf('before sorting array elements are - 
'); printarr(a, n); shell(a, printf('
after applying shell sort, the return 0; < pre> <p> <strong>Output</strong> </p> <p>After the execution of above code, the output will be -</p> <img src="//techcodeview.com/img/ds-tutorial/72/shell-sort-algorithm-7.webp" alt="Shell Sort Algorithm"> <p> <strong>Program:</strong> Write a program to implement Shell sort in C++.</p> <pre> #include using namespace std; /* function to implement shellSort */ int shell(int a[], int n) { /* Rearrange the array elements at n/2, n/4, ..., 1 intervals */ for (int interval = n/2; interval &gt; 0; interval /= 2) { for (int i = interval; i <n; i +="1)" { * store a[i] to the variable temp and make ith position empty int j; for (j="i;" j>= interval &amp;&amp; a[j - interval] &gt; temp; j -= interval) a[j] = a[j - interval]; // put temp (the original a[i]) in its correct position a[j] = temp; } } return 0; } void printArr(int a[], int n) /* function to print the array elements */ { int i; for (i = 0; i <n; 41 i++) cout< <a[i]<<' '; } int main() { a[]="{" 32, 30, 39, 7, 11, 16, 24, }; n="sizeof(a)" sizeof(a[0]); cout<<'before sorting array elements are - 
'; printarr(a, n); shell(a, cout<<'
after applying shell sort, the return 0; < pre> <p> <strong>Output</strong> </p> <p>After the execution of the above code, the output will be -</p> <img src="//techcodeview.com/img/ds-tutorial/72/shell-sort-algorithm-8.webp" alt="Shell Sort Algorithm"> <p> <strong>Program:</strong> Write a program to implement Shell sort in C#.</p> <pre> using System; class ShellSort { /* function to implement shellSort */ static void shell(int[] a, int n) { /* Rearrange the array elements at n/2, n/4, ..., 1 intervals */ for (int interval = n/2; interval &gt; 0; interval /= 2) { for (int i = interval; i <n; i +="1)" { * store a[i] to the variable temp and make ith position empty int j; for (j="i;" j>= interval &amp;&amp; a[j - interval] &gt; temp; j -= interval) a[j] = a[j - interval]; /* put temp (the original a[i]) in its correct position */ a[j] = temp; } } } static void printArr(int[] a, int n) /* function to print the array elements */ { int i; for (i = 0; i <n; 40 i++) console.write(a[i] + ' '); } static void main() { int[] a="{" 31, 29, 38, 6, 10, 15, 23, }; int n="a.Length;" console.write('before sorting array elements are - 
'); printarr(a, n); shell(a, console.write('
after applying shell sort, the < pre> <p> <strong>Output</strong> </p> <p>After the execution of the above code, the output will be -</p> <img src="//techcodeview.com/img/ds-tutorial/72/shell-sort-algorithm-9.webp" alt="Shell Sort Algorithm"> <p> <strong>Program:</strong> Write a program to implement Shell sort in Java.</p> <pre> class ShellSort { /* function to implement shellSort */ static void shell(int a[], int n) { /* Rearrange the array elements at n/2, n/4, ..., 1 intervals */ for (int interval = n/2; interval &gt; 0; interval /= 2) { for (int i = interval; i <n; i +="1)" { * store a[i] to the variable temp and make ith position empty int j; for (j="i;" j>= interval &amp;&amp; a[j - interval] &gt; temp; j -= interval) a[j] = a[j - interval]; /* put temp (the original a[i]) in its correct position */ a[j] = temp; } } } static void printArr(int a[], int n) /* function to print the array elements */ { int i; for (i = 0; i <n; 39 i++) system.out.print(a[i] + ' '); } public static void main(string args[]) { int a[]="{" 30, 28, 37, 5, 9, 14, 22, }; n="a.length;" system.out.print('before sorting array elements are - 
'); printarr(a, n); shell(a, system.out.print('
after applying shell sort, the < pre> <p> <strong>Output</strong> </p> <p>After the execution of the above code, the output will be -</p> <img src="//techcodeview.com/img/ds-tutorial/72/shell-sort-algorithm-10.webp" alt="Shell Sort Algorithm"> <p>So, that&apos;s all about the article. Hope the article will be helpful and informative to you.</p> <hr></n;></n;></pre></n;></n;></pre></n;></n;></pre></n;></n;>