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

07  {
                     08    int i;
                     09    int *f = calloc(max + 1, sizeof(int));            /* 누적 도수 */
                     10    int *b = calloc(n, sizeof(int));                 /* 작업용 목적 배열 */
                     11
                     12    for(i = 0; i <= max; i++) f[i] = 0;             /* [Step0] */
                     13    for(i = 0; i < n; i++) f[a[i]]++;               /* [Step1] */
                     14    for(i = 1; i <= max; i++) f[i] += f[i – 1];      /* [Step2] */
                     15    for(i = n - 1; i >= 0; i--) b[--f[a[i]]] = a[i];  /* [Step3] */
                     16    for(i = 0; i < n; i++) a[i] = b[i];             /* [Step4] */
                     17
                     18    free(b);
                     19    free(f);
                     20  }
                     21
                     22  int main(void)
                     23  {
                     24    int i, nx;
                     25    int *x;             /* 배열의 첫 번째 요소에 대한 포인터 */
                     26    const int max = 100;  /* 가장 큰 값 */
                     27    puts("도수 정렬");
                     28    printf("요소 개수 : ");
                     29
                     30    scanf("%d", &nx);
                     31    x = calloc(nx, sizeof(int));
                     32    printf("0 ~ %d의 정수를 입력하세요.\n", max);
                     33                                                         실행 결과
                     34    for(i = 0; i < nx; i++) {                     도수 정렬
                     35      do {                                        요소 개수 : 7
                     36        printf("x[%d] : ", i);                    0 ~ 100의 정수를 입력하세요.
                     37        scanf("%d", &x[i]);                       x[0] : 22
                                                                         x[1] : 5
                     38      } while(x[i] < 0 || x[i] > max);
                                                                         x[2] : 11
                     39    }
                                                                         x[3] : 32
                     40
                                                                         x[4] : 98
                     41    fsort(x, nx, max); /* 배열 x를 도수 정렬 */          x[5] : 68
                     42    puts("오름차순으로 정렬했습니다.");                       x[6] : 70
                     43                                                  오름차순으로 정렬했습니다.
                     44    for(i = 0; i < nx; i++)                       x[0] = 5
                     45      printf("x[%d] = %d\n", i, x[i]);            x[1] = 11
                     46                                                  x[2] = 22
                     47    free(x);          /* 배열을 해제 */                x[3] = 32
                     48                                                  x[4] = 68
                                                                         x[5] = 70
                     49    return 0;
                                                                         x[6] = 98
                     50  }


                   270   C 알고리즘
   265   266   267   268   269   270   271   272   273   274   275