logo

Shell rūšiavimo algoritmas

Šiame straipsnyje aptarsime apvalkalo rūšiavimo algoritmą. Shell sort yra įterpimo rūšiavimo apibendrinimas, kuris pašalina įterpimo rūšiavimo trūkumus, lyginant elementus, atskirtus kelių pozicijų tarpu.

Tai rūšiavimo algoritmas, kuris yra išplėstinė įterpimo rūšiavimo versija. Shell rūšiavimas pagerino vidutinį įterpimo rūšiavimo laiko sudėtingumą. Kaip panašus į įterpimo rūšiavimą, tai yra palyginimu pagrįstas rūšiavimo vietoje algoritmas. Shell rūšiavimas yra efektyvus vidutinio dydžio duomenų rinkiniams.

Įterpimo rūšiavimo metu elementai vienu metu gali būti perkeliami į priekį tik viena pozicija. Norint perkelti elementą į tolimą padėtį, reikia atlikti daug judesių, kurie padidina algoritmo vykdymo laiką. Tačiau apvalkalo rūšiavimas įveikia šį įterpimo rūšiavimo trūkumą. Tai taip pat leidžia judėti ir keisti tolimus elementus.

Šis algoritmas pirmiausia surūšiuoja elementus, kurie yra toli vienas nuo kito, o vėliau sumažina tarpą tarp jų. Ši spraga vadinama kaip intervalas. Šį intervalą galima apskaičiuoti naudojant Knutho žemiau pateikta formulė -

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

Dabar pažiūrėkime į apvalkalo rūšiavimo algoritmą.

Algoritmas

Paprasti apvalkalo rūšiavimo pasiekimo veiksmai yra išvardyti taip:

 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;>

„Shell“ rūšiavimo algoritmo veikimas

Dabar pažiūrėkime, kaip veikia apvalkalo rūšiavimo algoritmas.

Norėdami suprasti apvalkalo rūšiavimo algoritmo veikimą, paimkime nerūšiuotą masyvą. Per pavyzdį bus lengviau suprasti apvalkalo rūšiavimą.

Tegul masyvo elementai yra -

Shell rūšiavimo algoritmas

Kaip intervalus naudosime pradinę apvalkalo rūšiavimo seką, ty N/2, N/4,....,1.

Pirmoje kilpoje n yra lygus 8 (masyvo dydis), taigi elementai yra 4 intervale (n/2 = 4). Elementai bus lyginami ir sukeisti, jei jie nėra tvarkingi.

Čia, pirmoje kilpoje, elementas ties 0thpadėtis bus lyginama su 4 elementuthpadėtis. Jei 0thelementas yra didesnis, jis bus pakeistas 4 elementuthpadėtis. Priešingu atveju jis lieka toks pat. Šis procesas bus tęsiamas su likusiais elementais.

4 intervalu posąraščiai yra {33, 12}, {31, 17}, {40, 25}, {8, 42}.

Shell rūšiavimo algoritmas

Dabar turime palyginti kiekvieno sąrašo reikšmes. Palyginę, turime juos pakeisti, jei reikia, pradiniame masyve. Palyginus ir sukeitus, atnaujintas masyvas atrodys taip -

Shell rūšiavimo algoritmas

Antroje kilpoje elementai yra 2 intervale (n/4 = 2), kur n = 8.

java masyvo sąrašas

Dabar mes laikome intervalą 2 norėdami surūšiuoti likusią masyvo dalį. Su 2 intervalu bus sugeneruoti du posąraščiai – {12, 25, 33, 40} ir {17, 8, 31, 42}.

Shell rūšiavimo algoritmas

Dabar vėl turime palyginti reikšmes kiekviename posąraše. Palyginę, turime juos pakeisti, jei reikia, pradiniame masyve. Palyginus ir sukeitus, atnaujintas masyvas atrodys taip -

Shell rūšiavimo algoritmas

Trečiojoje kilpoje elementai yra 1 intervale (n/8 = 1), kur n = 8. Pagaliau mes naudojame 1 reikšmės intervalą likusiems masyvo elementams surūšiuoti. Šiame veiksme apvalkalo rūšiavimas naudoja įterpimo rūšiavimą masyvo elementams rūšiuoti.

Shell rūšiavimo algoritmas

Dabar masyvas rūšiuojamas didėjančia tvarka.

Korpuso rūšiavimo sudėtingumas

Dabar pažiūrėkime „Shell“ rūšiavimo sudėtingumą geriausiu, vidutiniu ir blogiausiu atveju. Taip pat pamatysime „Shell“ rūšiavimo erdvės sudėtingumą.

1. Laiko sudėtingumas

Byla Laiko sudėtingumas
Geriausias atvejis O (n*logn)
Vidutinis atvejis O(n*log(n)2)
Blogiausiu atveju O (n2)
    Geriausio atvejo sudėtingumas –Tai atsitinka, kai nereikia rūšiuoti, ty masyvas jau surūšiuotas. Geriausias „Shell“ rūšiavimo laiko sudėtingumas yra O(n*logn). Vidutinis atvejo sudėtingumas –Tai atsitinka, kai masyvo elementai yra sumaišyti, o tai netinkamai kyla ir netinkamai mažėja. Vidutinis „Shell“ rūšiavimo atvejo sudėtingumas yra O(n*logn). Blogiausio atvejo sudėtingumas –Tai atsitinka, kai masyvo elementus reikia rūšiuoti atvirkštine tvarka. Tai reiškia, kad jūs turite rūšiuoti masyvo elementus didėjančia tvarka, bet jo elementai yra mažėjančia tvarka. „Shell“ rūšiavimo sudėtingumas yra pats blogiausias atvejis O (n2).

2. Erdvės sudėtingumas

Erdvės sudėtingumas O(1)
Stabilus NE
  • „Shell“ rūšiavimo erdvės sudėtingumas yra O(1).

Shell rūšiavimo įgyvendinimas

Dabar pažiūrėkime, kaip Shell programos rūšiuojamos skirtingomis programavimo kalbomis.

Programa: Parašykite programą, kuri įdiegtų Shell sort C kalba.

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