Page 220 - Do it! 자료구조와 함께 배우는 알고리즘(C 언어, 3쇄)
P. 220

정렬되지 않은 상태의 배열(그림 6-17의  a   )에 대해 단순 삽입 정렬을 그냥 적용하는 것이 아

                   니라 ‘4-정렬’, ‘2-정렬’로 조금이라도 정렬이 된 상태에 가까운 배열( c   )로 만들어 놓은 다
                   음에 마지막으로 단순 삽입 정렬을 수행하여 정렬을 마칩니다. 이렇게 여러 개의 그룹으로 나
                   누어 정렬하는 이유는 단순 삽입 정렬의 장점은 살리고 단점은 보완하기 위해서입니다. 정렬
                   해야 하는 횟수는 늘지만 전체적으로는 요소 이동의 횟수가 줄어들어 효율적인 정렬을 할 수

                   있습니다.                       단순 삽입 정렬의 장점과 단점은 06-5절의 앞부분(217쪽)에 정리해 두었습니다.


                   실습 6-6은 셸 정렬 프로그램의 한 예입니다.


                      실습 6-6                                                  •완성 파일 chap06/shell1.c

                     01  /* 셸 정렬 */
                                                                                 실행 결과
                     02  #include <stdio.h>
                                                                           셸 정렬
                     03  #include <stdlib.h>
                                                                           요소 개수 : 7
                     04                                                    x[0] : 22
                     05  /*--- 셸 정렬 함수 ---*/                               x[1] : 5
                     06  void shell(int a[], int n)                        x[2] : 11
                     07  {                                                 x[3] : 32
                                                                           x[4] : 120
                     08    int i, j, h;
                                                                           x[5] : 68
                     09    for(h = n / 2; h > 0; h /= 2)
                                                                           x[6] : 70
                     10      for(i = h; i < n; i++) {                      오름차순으로 정렬했습니다.
                     11        int tmp = a[i];                             x[0] = 5
                     12        for(j = i - h; j >= 0 && a[j] > tmp; j -= h)  x[1] = 11
                     13          a[j + h] = a[j];                          x[2] = 22
                                                                           x[3] = 32
                     14        a[j + h] = tmp;
                                                                           x[4] = 68
                     15      }
                                                                           x[5] = 70
                     16  }                                                 x[6] = 120
                     17
                     18  int main(void)
                     19  {
                     20    int i, nx;
                     21    int *x;                     /* 배열의 첫 번째 요소에 대한 포인터 */
                     22    puts("셸 정렬");
                     23    printf("요소 개수 : ");
                     24    scanf("%d", &nx);
                     25    x = calloc(nx, sizeof(int));
                     26    for(i = 0; i < nx; i++) {
                     27      printf("x[%d] : ", i);
                     28      scanf("%d", &x[i]);





                   220   C 알고리즘
   215   216   217   218   219   220   221   222   223   224   225