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

全部博文(100)

文章存档

2011年(100)

分类: C/C++

2011-04-20 16:44:55

  1. #include <stdio.h>

  2. void myPrint(int *A, int len);
  3. void mySwap(int *A, int *B);
  4. int left(int i);
  5. int right(int i);
  6. void maxHeapV(int *A, int i, int len);
  7. void buildMaxHeap(int *A, int len);
  8. void heapSort(int *A, int len);

  9. int
  10. main(void)
  11. {
  12.         int a[] = {1,3,5,7,9,0,2,4,6,8,0};
  13.         int len = sizeof(a)/sizeof(a[0]);

  14.         myPrint(a, len);
  15.         heapSort(a, len);
  16.         myPrint(a, len);

  17.         return (0);
  18. }

  19. void
  20. myPrint(int *A, int len)
  21. {
  22.         printf("Enter: ");
  23.         int i = 0;
  24.         for (i = 0; i < len; i++) {
  25.                 printf("%d,",*(A+i));
  26.         }
  27.         printf("\n");
  28. }

  29. void
  30. mySwap(int *A, int *B)
  31. {
  32.         int tmp;
  33.         tmp = *A;
  34.         *A = *B;
  35.         *B = tmp;
  36. }

  37. int
  38. left(int i)
  39. {
  40.         return (2*i);
  41. }

  42. int
  43. right(int i)
  44. {
  45.         return (2*i + 1);
  46. }

  47. void
  48. maxHeapV(int *A, int i, int len)
  49. {
  50.         int lf = left(i);
  51.         int rt = right(i);
  52.         int largest;
  53.         int tmp;
  54.         if (lf < len && *(A+lf) > *(A+i))
  55.                 largest = lf;
  56.         else
  57.                 largest = i;

  58.         if (rt < len && *(A+rt) > *(A+largest))
  59.                 largest = rt;

  60.         if (largest != i) {
  61.                 mySwap(A+largest, A+i);
  62.                 maxHeapV(A, largest, len);
  63.         }
  64. }

  65. void
  66. buildMaxHeap(int *A, int len)
  67. {
  68.         int i;
  69.         for (i = len-1; i >=0; i--) {
  70.                 maxHeapV(A, i, len);
  71.         }
  72. }
  73. void
  74. heapSort(int *A, int len)
  75. {
  76.         int i;
  77.         buildMaxHeap(A, len);
  78.         for (i = len-1; i > 0; i--) {
  79.                 mySwap(A+i, A+0);
  80.                 len--;
  81.                 maxHeapV(A, 0, len);
  82.         }
  83. }
稳定性:非稳定
T(n):Θ(nlogn)
S(n): O(1)



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

上一篇:希尔排序

下一篇:管道

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