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

29    }
                         30    shell(x, nx);                     /* 배열 x를 셸 정렬 */
                         31    puts("오름차순으로 정렬했습니다.");
                         32    for(i = 0; i < nx; i++)
                         33      printf("x[%d] = %d\n", i, x[i]);
                         34    free(x);                          /* 배열을 해제 */
                         35
                         36    return 0;
                         37  }

                          단순 삽입 정렬을 수행하는 부분(초록색 박스로 표시한 부분)은 실습 6-5와 거의 같습니다. 차이점은 선택한 요소와 비교
                        하는 요소가 서로 이웃하지 않고 h칸만큼 떨어져 있다는 것입니다.


                        증분값(h 값)의 선택

                        앞에서는 h 값을 아래처럼 변화시켰습니다.


                         h = 4, 2, 1



                        h 값은 n부터 감소하여 마지막에 1이 되면 됩니다. 그러면 h 값을 어떤 수열로 감소해야 좀 더
                        효율적으로 정렬할 수 있을까요? 실제로 어떤 수열이 알맞을까요? 앞에서 했던 ‘배열을 그룹

                        으로 나누는 과정’을 다시 살펴보겠습니다.

                         a
                            8   1    4   2    7   6    3    5


                         b                      c
                              8    7
                                                    7   3    8   4
                              1    6
                              4    3
                                                    1   2    6   5
                              2    5

                             4-정렬 × 4                  2-정렬 × 2

                                 [그림 6-18] 셸 정렬의 그룹 분할 과정(h = 4, 2, 1)


                        여기서는  a   가 학생 8명의 점수를 나타내고 있다고 가정합시다. 먼저  b   처럼 학생을 2명씩
                        4개의 그룹으로 나누어 정렬하고  c   처럼 학생을 4명씩 2개의 그룹으로 나누어 다시 정렬합





                                                                                          06•정렬  221
   216   217   218   219   220   221   222   223   224   225   226