当前位置:   article > 正文

最大二叉堆的建立以及最大堆排序_二叉树建立最大堆,从哪个节点开始出发做heapfiy

二叉树建立最大堆,从哪个节点开始出发做heapfiy
  1. //最大二叉堆实际上就是一个顺序数组,这个数组遵循这样的规律:若将数组按顺序写成二叉树的形式,则除根节点外,树中节点不大于其父节点
  2. #include "stdafx.h"
  3. //二叉堆的建立
  4. //先将输入序列排序成二叉堆的形式
  5. template<class T>
  6. void max_heapify(vector<T>& vec,int i,int heap_size)
  7. {
  8. int l=2*i;
  9. int r=2*i+1;
  10. int largest;
  11. if(l<=heap_size-1&&vec[l]>vec[i])
  12. largest=l;
  13. else
  14. largest=i;
  15. if(r<=heap_size-1&&vec[r]>vec[largest])
  16. largest=r;
  17. if(largest!=i)
  18. {
  19. swap(vec[i],vec[largest]);
  20. max_heapify(vec,largest,heap_size);
  21. }
  22. }
  23. template<class T>
  24. void build_max_heap(vector<T>& vec)
  25. {
  26. int heap_size=vec.size();
  27. for(int i=vec.size()/2-1;i>=0;--i)
  28. {
  29. max_heapify(vec,i,heap_size);
  30. }
  31. }
  32. template<class T>
  33. void heap_sort(vector<T>& vec)
  34. {
  35. int heap_size=vec.size();
  36. build_max_heap(vec);
  37. for(int i=vec.size()-1;i>=1;--i)
  38. {
  39. swap(vec[i],vec[0]);
  40. --heap_size;
  41. max_heapify(vec,0,heap_size);
  42. }
  43. }
  44. int main()
  45. {
  46. vector<int> ivec;
  47. for(int i=0;i<10;++i)
  48. {
  49. int n=rand()%10;
  50. ivec.push_back(n);
  51. }
  52. cout<<"before sort"<<endl;
  53. for(vector<int>::iterator iter=begin(ivec);iter!=end(ivec);++iter)
  54. {
  55. cout<<*iter<<" ";
  56. }
  57. cout<<endl;
  58. build_max_heap(ivec);
  59. cout<<"after heapify"<<endl;
  60. for(vector<int>::iterator iter=begin(ivec);iter!=end(ivec);++iter)
  61. {
  62. cout<<*iter<<" ";
  63. }
  64. cout<<endl;
  65. heap_sort(ivec);
  66. cout<<"after heap_sort"<<endl;
  67. for(vector<int>::iterator iter=begin(ivec);iter!=end(ivec);++iter)
  68. {
  69. cout<<*iter<<" ";
  70. }
  71. cout<<endl;
  72. }




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

闽ICP备14008679号