logo

Алгоритъм за сортиране на Shell

В тази статия ще обсъдим алгоритъма за сортиране на обвивката. Shell сортирането е обобщение на сортирането чрез вмъкване, което преодолява недостатъците на сортирането чрез вмъкване чрез сравняване на елементи, разделени с празнина от няколко позиции.

Това е алгоритъм за сортиране, който е разширена версия на сортирането чрез вмъкване. Shell сортирането подобри средната времева сложност на сортирането чрез вмъкване. Подобно на сортирането чрез вмъкване, това е алгоритъм за сортиране на място, базиран на сравнение. Shell сортирането е ефективно за средни по размер набори от данни.

При сортиране чрез вмъкване в даден момент елементите могат да бъдат преместени напред само с една позиция. За да преместите елемент в далечна позиция, са необходими много движения, които увеличават времето за изпълнение на алгоритъма. Но shell сортирането преодолява този недостатък на сортирането чрез вмъкване. Позволява движението и размяната и на отдалечени елементи.

Този алгоритъм първо сортира елементите, които са далеч един от друг, след което впоследствие намалява разстоянието между тях. Тази празнина се нарича като интервал. Този интервал може да се изчисли с помощта на на Кнут формула, дадена по-долу -

q2 месеца
 h = h * 3 + 1 where, 'h' is the interval having initial value 1. 

Сега нека видим алгоритъма за сортиране на обвивката.

Алгоритъм

Простите стъпки за постигане на сортирането на черупката са изброени както следва -

празнота 0
 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

Сега нека видим работата на алгоритъма за сортиране на обвивката.

За да разберем работата на алгоритъма за сортиране на shell, нека вземем несортиран масив. Ще бъде по-лесно да разберете сортирането на черупката чрез пример.

Нека елементите на масива са -

Алгоритъм за сортиране на Shell

Ще използваме оригиналната последователност от сортиране на черупки, т.е. N/2, N/4,....,1 като интервали.

В първия цикъл n е равно на 8 (размер на масива), така че елементите лежат на интервал от 4 (n/2 = 4). Елементите ще бъдат сравнени и разменени, ако не са в ред.

Тук, в първия цикъл, елементът при 0thпозицията ще бъде сравнена с елемента на 4thпозиция. Ако 0thелементът е по-голям, той ще бъде разменен с елемента на 4thпозиция. Иначе си остава същото. Този процес ще продължи за останалите елементи.

На интервал от 4 подсписъците са {33, 12}, {31, 17}, {40, 25}, {8, 42}.

Алгоритъм за сортиране на Shell

Сега трябва да сравним стойностите във всеки подсписък. След сравняване трябва да ги разменим, ако е необходимо в оригиналния масив. След сравняване и размяна актуализираният масив ще изглежда по следния начин -

Алгоритъм за сортиране на Shell

Във втория цикъл елементите лежат на интервал от 2 (n/4 = 2), където n = 8.

конвертиране на низ в цяло число

Сега вземаме интервала от 2 за сортиране на останалата част от масива. С интервал от 2 ще бъдат генерирани два подсписъка - {12, 25, 33, 40} и {17, 8, 31, 42}.

Алгоритъм за сортиране на Shell

Сега отново трябва да сравним стойностите във всеки подсписък. След сравняване трябва да ги разменим, ако е необходимо в оригиналния масив. След сравняване и размяна актуализираният масив ще изглежда по следния начин -

низ в java методи
Алгоритъм за сортиране на Shell

В третия цикъл елементите лежат на интервал от 1 (n/8 = 1), където n = 8. Накрая използваме интервала със стойност 1, за да сортираме останалите елементи на масива. В тази стъпка shell сортирането използва сортиране чрез вмъкване, за да сортира елементите на масива.

Алгоритъм за сортиране на Shell

Сега масивът е сортиран във възходящ ред.

Сложност на сортиране на Shell

Сега нека видим времевата сложност на сортирането на Shell в най-добрия случай, средния случай и най-лошия случай. Ще видим и космическата сложност на сортирането на Shell.

1. Времева сложност

Случай Времева сложност
Най-добър случай O(n*logn)
Среден случай O(n*log(n)2)
Най-лошия случай На2)
    Сложност в най-добрия случай -Това се случва, когато не се изисква сортиране, т.е. масивът вече е сортиран. Най-добрият случай на времева сложност на сортирането на Shell е O(n*logn). Средна сложност на случая -Това се случва, когато елементите на масива са в разбъркан ред, който не е правилно възходящ и неправилно низходящ. Средната времева сложност на случай на сортиране на Shell е O(n*logn). Сложност в най-лошия случай -Това се случва, когато елементите на масива трябва да бъдат сортирани в обратен ред. Това означава, че трябва да сортирате елементите на масива във възходящ ред, но неговите елементи са в низходящ ред. Най-лошият случай на времева сложност на сортирането на Shell е На2).

2. Космическа сложност

Космическа сложност О(1)
Стабилен НЕ
  • Пространствената сложност на сортирането на Shell е O(1).

Внедряване на сортиране на Shell

Сега, нека видим програмите на Shell sort в различни езици за програмиране.

програма: Напишете програма за реализиране на Shell сортиране на език C.

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