Chinaunix首页 | 论坛 | 博客
  • 博客访问: 370666
  • 博文数量: 100
  • 博客积分: 2500
  • 博客等级: 大尉
  • 技术积分: 1209
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-15 21:24
文章分类

全部博文(100)

文章存档

2011年(100)

分类: C/C++

2011-05-16 11:47:13


  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <limits.h>

  5. #define NUM    100
  6. #define LEN    100

  7. void initArray(int *A, int len);
  8. void printArray(int *A, int len);
  9. void mySwap(int *a, int *b);
  10. void bubbleSort(int *A, int len);
  11. void insertSort(int *A, int len);
  12. void selectSort(int *A, int len);
  13. void quickSort(int *A, int begin, int end);
  14. void mergeSort(int *A, int begin, int end);
  15. void heapSort(int *A, int len);
  16. void shellSort(int *A, int len);

  17. int
  18. main(void)
  19. {
  20.     int a[LEN] = {0};
  21.     
  22.     initArray(a, LEN);
  23.     printArray(a, LEN);

  24.     bubbleSort(a, LEN);
  25.     printArray(a, LEN);

  26.     insertSort(a, LEN);
  27.     printArray(a, LEN);

  28.     selectSort(a, LEN);
  29.     printArray(a, LEN);

  30.     printf("\nQuick sort:");
  31.     quickSort(a, 0, LEN-1);
  32.     printArray(a, LEN);

  33.     printf("\nMerge sort:");
  34.     mergeSort(a, 0, LEN-1);
  35.     printArray(a, LEN);

  36.     heapSort(a, LEN);
  37.     printArray(a, LEN);

  38.     shellSort(a, LEN);
  39.     printArray(a, LEN);

  40.     return 0;
  41. }

  42. void
  43. initArray(int *A, int len)
  44. {
  45.     printf("\nInit array:");
  46.     int i;
  47.     srand((unsigned int )time(0));
  48.     for ( i = 0; i < len; i++)
  49.         *(A+i) = rand() % NUM ;
  50. }

  51. void
  52. printArray(int *A, int len)
  53. {
  54.     int i;
  55.     printf("\nBegin:\n");
  56.     
  57.     for (i = 0; i < len; i++) {
  58.         printf("%5d, ", *(A+i));
  59.         if ((i+1)%20 == 0)
  60.             printf("\n");
  61.     }

  62.     printf("\nEnd:\n");
  63. }

  64. void
  65. mySwap(int *a, int *b)
  66. {
  67.     int tmp;
  68.     tmp = *a;
  69.     *a = *b;
  70.     *b = tmp;
  71. }

  72. void
  73. bubbleSort(int *A, int len)
  74. {
  75.     printf("\nBubble sort:");

  76.     if (len <= 1)
  77.         return ;

  78.     int i, j;
  79.     for (i = 0; i < len; i++) {
  80.         for (j = len-1; j > i; j--)
  81.             if (*(A+j) < *(A+j-1))
  82.                 mySwap(A+j, A+j-1);
  83.     }
  84. }

  85. void
  86. insertSort(int *A, int len)
  87. {
  88.     printf("\nInsert sort:");

  89.     if (len <= 1)
  90.         return ;

  91.     int i, j;
  92.     for (j = 1; j < len; j++) {
  93.         int tmp = *(A+j);
  94.         i = j - 1;
  95.         while (i >= 0 && *(A+i) >= tmp) {
  96.             *(A+i+1) = *(A+i);
  97.             --i;
  98.         }
  99.         *(A+i+1) = tmp;
  100.     }
  101. }

  102. void
  103. selectSort(int *A, int len)
  104. {
  105.     printf("\nSelect sort:");

  106.     if (len <= 1)
  107.         return ;

  108.     int i, j, min;
  109.     for (i = 0; i < len-1; i++) {
  110.         min = i;
  111.         for (j = i+1; j < len; j++) {
  112.             if (*(A+j) < *(A+i))
  113.                 min = j;
  114.         }
  115.         if (min != i)
  116.             mySwap(A+i, A+min);
  117.     }
  118. }

  119. static int
  120. paration(int *A, int begin, int end)
  121. {
  122.     int base;
  123.     int i;

  124.     base = *(A+begin);
  125.     i = begin + 1;
  126.     while (i <= end) {
  127.         if (*(A+i) <= base) {
  128.             *(A+i-1) = *(A+i);
  129.             ++i;
  130.         } else {
  131.             mySwap(A+i, A+end);
  132.             --end;
  133.         }
  134.     }
  135.     *(A+i-1) = base;

  136.     return (i-1);
  137. }

  138. void
  139. quickSort(int *A, int begin, int end)
  140. {
  141.     int mid;
  142.     if (begin < end) {
  143.         mid = paration(A, begin, end);
  144.         quickSort(A, begin, mid-1);
  145.         quickSort(A, mid+1, end);
  146.     }    
  147. }

  148. static void
  149. merge(int *A, int begin, int mid, int end)
  150. {
  151.     int n1, n2;
  152.     n1 = mid - begin + 1 + 1;
  153.     n2 = end - mid + 1;
  154.     int L[n1], R[n2];
  155.     int i, j, k;

  156.     for (i = 0; i < n1-1; i++)
  157.         L[i] = *(A+begin+i);
  158.     for (j = 0; j < n2-1; j++)
  159.         R[j] = *(A+mid+1+j);

  160.     L[i] = INT_MAX;
  161.     R[j] = INT_MAX;
  162.     i = 0;
  163.     j = 0;

  164.     for (k = begin; k <= end; k++) {
  165.         if (L[i] <= R[j]) {
  166.             *(A+k) = L[i];
  167.             ++i;
  168.         } else {
  169.             *(A+k) = R[j];
  170.             ++j;
  171.         }
  172.     }
  173. }

  174. void
  175. mergeSort(int *A, int begin, int end)
  176. {
  177.     int mid;
  178.     if (begin < end) {
  179.         mid = (begin + end)/2;
  180.         mergeSort(A, begin, mid);
  181.         mergeSort(A, mid+1, end);
  182.         merge(A, begin, mid, end);
  183.     }
  184. }

  185. static void
  186. maxHeapVerify(int *A, int i, int len)
  187. {
  188.     int lf = 2*i;
  189.     int rt = 2*i+1;
  190.     int lg;

  191.     if (lf < len && *(A+lf) > *(A+i))
  192.         lg = lf;
  193.     else
  194.         lg = i;

  195.     if (rt < len && *(A+rt) > *(A+lg))
  196.         lg = rt;
  197.     
  198.     if (lg != i) {
  199.         mySwap(A+lg, A+i);
  200.         maxHeapVerify(A, lg, len);
  201.     }
  202. }

  203. static void
  204. buildMaxHeap(int *A, int len)
  205. {
  206.     int i;
  207.     for (i = len-1; i >= 0; i--)
  208.         maxHeapVerify(A, i, len);
  209. }

  210. void
  211. heapSort(int *A, int len)
  212. {
  213.     printf("\nHeap sort:");

  214.     if (len <= 1)
  215.         return ;

  216.     int i;
  217.     buildMaxHeap(A, len);
  218.     for (i = len-1; i > 0; i--) {
  219.         mySwap(A+i, A);
  220.         --len;
  221.         maxHeapVerify(A, 0, len);
  222.     }
  223. }

  224. static void
  225. shellPass(int *A, int step, int len)
  226. {
  227.     int i, j, k;
  228.     int tmp;
  229.     
  230.     for (i = 0; i < step; i++) {
  231.         for (j = (i+1)*step; j < len; j+= step) {
  232.             tmp = *(A+j);
  233.             k = j - step;
  234.             while (k >= i && *(A+k) > tmp) {
  235.                 *(A+k+step) = *(A+k);
  236.                 k -= step;
  237.             }
  238.             *(A+k+step) = tmp;
  239.         }
  240.     }
  241. }

  242. void
  243. shellSort(int *A, int len)
  244. {
  245.     printf("\nShell sort:");

  246.     if (len <= 1)
  247.         return ;

  248.     int step = len;
  249.     do {
  250.         step = step / 3 + 1;
  251.         shellPass(A, step, len);
  252.     } while (step > 1);
  253. }

阅读(1309) | 评论(0) | 转发(0) |
0

上一篇:string之strlen

下一篇:单实例模式1

给主人留下些什么吧!~~