优先级队列-堆的简单实现

桃扇骨 2023-07-12 05:05 134阅读 0赞
  1. 1 #include <cstdio>
  2. 2 #include <iostream>
  3. 3
  4. 4 using namespace std;
  5. 5
  6. 6 const int MAX_N = 1000;
  7. 7
  8. 8 // 用数组来实现二叉树
  9. 9 // 左儿子编号=自己*2 + 1
  10. 10 // 右儿子编号=自己*2 + 1
  11. 11 int heap[MAX_N],sz=0;
  12. 12
  13. 13 // 实现最小堆
  14. 14 void push(int x)
  15. 15 {
  16. 16 // 取最后一个节点的编号,并递增。
  17. 17 int i=sz++;
  18. 18 // 循环更改所有颠倒序列
  19. 19 while(i>0)
  20. 20 {
  21. 21 int p=(i-1)/2;
  22. 22 // 无颠倒序列,退出循环
  23. 23 if(heap[p]<=x)
  24. 24 {
  25. 25 break;
  26. 26 }
  27. 27 else
  28. 28 {
  29. 29 heap[i]=heap[p];
  30. 30 i=p;
  31. 31 }
  32. 32 }
  33. 33 // 填入新数
  34. 34 heap[i]=x;
  35. 35 }
  36. 36
  37. 37 // 返回最小值(堆顶),然后在堆顶放置堆中最后一个元素
  38. 38 // 向下更新,直到有序
  39. 39 int pop()
  40. 40 {
  41. 41 int ret=heap[0];
  42. 42 // 记录要提到根节点的数
  43. 43 int x=heap[--sz];
  44. 44 int i=0;
  45. 45 while(2*i+1 < sz)
  46. 46 {
  47. 47 int a=2*i+1,b=2*i+2;
  48. 48 // 如果存在右儿子,且右儿子的值比做儿子小,则记左右儿子中较小者编号a为右儿子的编号
  49. 49 if(b<sz && heap[a]>heap[b])
  50. 50 {
  51. 51 a=b;
  52. 52 }
  53. 53 // 无逆序,退出循环
  54. 54 if(heap[a]>=x)
  55. 55 {
  56. 56 break;
  57. 57 }
  58. 58 // 否则将较小数前提,继续向下寻找
  59. 59 heap[i]=heap[a];
  60. 60 i=a;
  61. 61 }
  62. 62 // 最后将x写入适当的位置
  63. 63 heap[i]=x;
  64. 64
  65. 65 return ret;
  66. 66 }
  67. 67
  68. 68
  69. 69 int main()
  70. 70 {
  71. 71 push(1);
  72. 72 push(5);
  73. 73 push(4);
  74. 74
  75. 75 cout<<pop()<<endl;
  76. 76 push(2);
  77. 77 push(7);
  78. 78 cout<<pop()<<endl;
  79. 79 cout<<pop()<<endl;
  80. 80 push(9);
  81. 81 for(int i=0;i<3;++i)
  82. 82 {
  83. 83 cout<<pop()<<endl;
  84. 84 }
  85. 85 return 0;
  86. 86 }

发表评论

表情:
评论列表 (有 0 条评论,134人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java优先级队列-

    本文章主要讲解了基二叉树之后的知识点堆,讲解了什么是堆,以及堆的应用-优先级队列的使用,用堆来解决TopK问题,作者在最后为各位读者准备了习题以及讲解答案,希望对大家有帮...

    相关 优先级队列

    优先级队列 概念 > 我们知道,队列是一种先进先出的数据结构,但有些情况下,操作的数据可能带有优先级,一般出队列时,可能需要优先级高的元素先出队列,该中场景下,使用