logo

쉘 정렬 알고리즘

이번 포스팅에서는 쉘 정렬 알고리즘에 대해 알아보겠습니다. 쉘 정렬은 삽입 정렬의 일반화로, 여러 위치의 간격으로 분리된 요소를 비교하여 삽입 정렬의 단점을 극복합니다.

삽입 정렬의 확장 버전인 정렬 알고리즘입니다. 쉘 정렬은 삽입 정렬의 평균 시간 복잡성을 개선했습니다. 삽입 정렬과 유사하게 비교 기반 및 내부 정렬 알고리즘입니다. 쉘 정렬은 중간 크기의 데이터 세트에 효율적입니다.

삽입 정렬에서는 요소를 한 번에 한 위치씩 앞으로 이동할 수 있습니다. 요소를 멀리 있는 위치로 이동하려면 많은 이동이 필요하며 알고리즘의 실행 시간이 늘어납니다. 그러나 쉘 정렬은 삽입 정렬의 이러한 단점을 극복합니다. 멀리 있는 요소의 이동 및 교환도 가능합니다.

이 알고리즘은 먼저 서로 멀리 떨어져 있는 요소를 정렬한 다음 그 사이의 간격을 줄입니다. 이 간격을 다음과 같이 부릅니다. 간격. 이 간격은 다음을 사용하여 계산할 수 있습니다. 크누스의 아래 주어진 공식 -

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

이제 쉘 정렬 알고리즘을 살펴보겠습니다.

연산

쉘 정렬을 수행하는 간단한 단계는 다음과 같습니다.

 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 정렬 알고리즘의 작동

이제 쉘 정렬 알고리즘의 작동을 살펴보겠습니다.

쉘 정렬 알고리즘의 작동을 이해하기 위해 정렬되지 않은 배열을 살펴보겠습니다. 예제를 통해 쉘 정렬을 이해하는 것이 더 쉬울 것입니다.

배열의 요소는 다음과 같습니다.

쉘 정렬 알고리즘

우리는 쉘 정렬의 원래 시퀀스, 즉 N/2, N/4,...,1을 간격으로 사용합니다.

첫 번째 루프에서 n은 8(배열 크기)과 같으므로 요소는 4(n/2 = 4) 간격으로 배치됩니다. 요소는 순서가 맞지 않으면 비교되고 교체됩니다.

여기 첫 번째 루프에서 0에 있는 요소는위치는 4의 요소와 비교됩니다.위치. 0인 경우요소가 더 크면 4에 있는 요소로 교체됩니다.위치. 그렇지 않으면 동일하게 유지됩니다. 이 프로세스는 나머지 요소에 대해 계속됩니다.

4 간격에서 하위 목록은 {33, 12}, {31, 17}, {40, 25}, {8, 42}입니다.

쉘 정렬 알고리즘

이제 모든 하위 목록의 값을 비교해야 합니다. 비교한 후 필요한 경우 원래 배열에서 교체해야 합니다. 비교하고 교체한 후 업데이트된 배열은 다음과 같습니다.

쉘 정렬 알고리즘

두 번째 루프에서는 요소가 2(n/4 = 2) 간격으로 놓여 있습니다. 여기서 n = 8입니다.

이제 우리는 2 배열의 나머지 부분을 정렬합니다. 간격이 2이면 두 개의 하위 목록({12, 25, 33, 40} 및 {17, 8, 31, 42})이 생성됩니다.

쉘 정렬 알고리즘

이제 다시 모든 하위 목록의 값을 비교해야 합니다. 비교한 후 필요한 경우 원래 배열에서 교체해야 합니다. 비교하고 교체한 후 업데이트된 배열은 다음과 같습니다.

arp 명령
쉘 정렬 알고리즘

세 번째 루프에서는 요소가 1(n/8 = 1) 간격으로 놓여 있으며 여기서 n = 8입니다. 마지막으로 값 1의 간격을 사용하여 나머지 배열 요소를 정렬합니다. 이 단계에서 쉘 정렬은 삽입 정렬을 사용하여 배열 요소를 정렬합니다.

쉘 정렬 알고리즘

이제 배열이 오름차순으로 정렬되었습니다.

쉘 정렬 복잡성

이제 쉘 정렬의 시간 복잡도를 최상의 경우, 평균적인 경우, 최악의 경우로 살펴보겠습니다. 또한 Shell 정렬의 공간 복잡도도 살펴보겠습니다.

1. 시간 복잡도

사례 시간 복잡도
최선의 경우 O(n*logn)
평균 사례 O(n*log(n)2)
최악의 경우 2)
    최상의 경우 복잡성 -정렬이 필요하지 않은 경우, 즉 배열이 이미 정렬되어 있는 경우에 발생합니다. 쉘 정렬의 최상의 경우 시간 복잡도는 다음과 같습니다. O(n*logn). 평균 사례 복잡성 -이는 배열 요소가 제대로 오름차순이 아니고 내림차순이 아닌 뒤죽박죽된 순서로 되어 있을 때 발생합니다. Shell 정렬의 평균 사례 시간 복잡도는 다음과 같습니다. O(n*logn). 최악의 경우 복잡성 -배열 요소를 역순으로 정렬해야 할 때 발생합니다. 즉, 배열 요소를 오름차순으로 정렬해야 하지만 해당 요소는 내림차순으로 정렬되어 있다고 가정해 보세요. 쉘 정렬의 최악의 시간 복잡도는 다음과 같습니다. 2).

2. 공간 복잡성

공간 복잡도 오(1)
안정적인 아니요
  • 쉘 정렬의 공간 복잡도는 O(1)입니다.

쉘 정렬 구현

이제 다양한 프로그래밍 언어로 작성된 Shell sort 프로그램을 살펴보겠습니다.

프로그램: 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;>