当前位置:   article > 正文

堆排序 纯C代码_堆全排列c代码

堆全排列c代码

跟上一篇实现思路一样,感觉还是少出现点幻数比较好,由于heapAdjust()调用频繁,故要尽量提高这段代码的效率


  1. #include <stdio.h>
  2. #define N 1000
  3. #define INF 999999999
  4. int h[N];
  5. //调整堆(迭代法)
  6. //n:规模 i:二叉子堆的堆顶
  7. void
  8. heapAdjust(int n, int par)
  9. {
  10. int tmp, pos, lc, rc;
  11. while (par <= n/2) {
  12. tmp = h[par]; //记录父母结点键值
  13. lc = par<<1;
  14. rc = lc+1;
  15. pos = par;
  16. //父母结点至多更新2次
  17. if (h[par] < h[lc]) {
  18. h[par] = h[lc];
  19. pos = lc;
  20. }
  21. if (rc <= n && h[par] < h[rc]) {
  22. h[par] = h[rc];
  23. pos = rc;
  24. }
  25. if (pos == par) //无更新即无需调整
  26. break;
  27. else
  28. h[pos] = tmp;
  29. par = pos; //假设这个位置的结点是“父母结点”
  30. }
  31. }
  32. //创建堆
  33. //规模为n的堆,对其父母结点,自底向上自右向左地调整堆
  34. void
  35. createHeap(int n)
  36. {
  37. int i;
  38. for (i = n/2; i != 0; i--) {
  39. heapAdjust(n, i);
  40. }
  41. }
  42. void
  43. heapSort(int n)
  44. {
  45. int ntimes = n;
  46. while (ntimes--) {
  47. printf("%d\n", h[1]);
  48. h[1] = h[n];
  49. h[n--] = 0; //堆清零
  50. heapAdjust(n, 1);
  51. }
  52. }
  53. int
  54. main(void)
  55. {
  56. int n, i;
  57. scanf("%d", &n);
  58. h[0] = INF;
  59. for (i = 1; i != n+1; i++) {
  60. scanf("%d", &h[i]);
  61. }
  62. createHeap(n);
  63. heapSort(n);
  64. return 0;
  65. }
  66. /*
  67. 参考测试数据
  68. 6
  69. 342 31 52 626 12 124
  70. 10
  71. 43 525 14 21 52 3 52 45 319 15155
  72. */


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/707535
推荐阅读
相关标签
  

闽ICP备14008679号