STL算法,堆排序

/*****************************************
STL-算法–Heap算法

堆排序算法 (heapsort)
make_heap()         //把容器内的数据做堆排序
push_heap()         //向堆内放入元素
pop_heap()          //删除堆顶元素
sort_heap()         //把堆排还原成普通排序

*****************************************/
/**———————————————————————————-
make_heap(b,e)                                  9
make_heap(b,e,cp)                      /                  \
push_heap(b,e)                        8                    6
push_heap(b,e,cp)                /         \          /          \
pop_heap(b,e)                   7           7        5            5
pop_heap(b,e,cp)              /   \       /   \    /   \        /
sort_heap(b,e)               3     6     4     1  2     3      4
sort_heap(b,e,cp)
———————————————————————————-**/


[cpp] 
view plain
 copy

  1. /**——http://blog.csdn.net/u010579068——**/  
  2. #include<iostream>  
  3. #include<cstdio>  
  4. #include<string>  
  5. #include<vector>  
  6. #include<list>  
  7. #include<deque>  
  8. #include<algorithm>  
  9. using namespace std;  
  10.   
  11. /***************************************** 
  12. STL-算法–Heap算法 
  13.  
  14. 堆排序算法 (heapsort) 
  15. make_heap()         //把容器内的数据做堆排序 
  16. push_heap()         //向堆内放入元素 
  17. pop_heap()          //删除堆顶元素 
  18. sort_heap()         //把堆排还原成普通排序 
  19.  
  20. *****************************************/  
  21. /**———————————————————————————- 
  22. make_heap(b,e)                                  9 
  23. make_heap(b,e,cp)                      /                  \ 
  24. push_heap(b,e)                        8                    6 
  25. push_heap(b,e,cp)                /         \          /          \ 
  26. pop_heap(b,e)                   7           7        5            5 
  27. pop_heap(b,e,cp)              /   \       /   \    /   \        / 
  28. sort_heap(b,e)               3     6     4     1  2     3      4 
  29. sort_heap(b,e,cp) 
  30. ———————————————————————————-**/  
  31. /************************************************************************************* 
  32. std::make_heap                     所有排序容器适用                         algorithm 
  33. ————————————————————————————– 
  34. template <class RandomAccessIterator> 
  35.   void make_heap ( RandomAccessIterator first, RandomAccessIterator last ); 
  36.  
  37. template <class RandomAccessIterator, class Compare> 
  38.   void make_heap ( RandomAccessIterator first, RandomAccessIterator last, 
  39.                    Compare comp ); 
  40. //eg: 
  41.  
  42. *************************************************************************************/  
  43.   
  44. /************************************************************************************* 
  45. std::push_heap                     所有排序容器适用                         algorithm 
  46. ————————————————————————————– 
  47. template <class RandomAccessIterator> 
  48.   void push_heap ( RandomAccessIterator first, RandomAccessIterator last ); 
  49.  
  50. template <class RandomAccessIterator, class Compare> 
  51.   void push_heap ( RandomAccessIterator first, RandomAccessIterator last, 
  52.                    Compare comp ); 
  53. //eg: 
  54.  
  55. *************************************************************************************/  
  56.   
  57. /************************************************************************************* 
  58. std::pop_heap                     所有排序容器适用                         algorithm 
  59. ————————————————————————————– 
  60. template <class RandomAccessIterator> 
  61.   void pop_heap ( RandomAccessIterator first, RandomAccessIterator last ); 
  62.  
  63. template <class RandomAccessIterator, class Compare> 
  64.   void pop_heap ( RandomAccessIterator first, RandomAccessIterator last, 
  65.                    Compare comp ); 
  66. //eg: 
  67.  
  68. *************************************************************************************/  
  69.   
  70. /************************************************************************************* 
  71. std::sort_heap                     所有排序容器适用                         algorithm 
  72. ————————————————————————————– 
  73. template <class RandomAccessIterator> 
  74.   void sort_heap ( RandomAccessIterator first, RandomAccessIterator last ); 
  75.  
  76. template <class RandomAccessIterator, class Compare> 
  77.   void sort_heap ( RandomAccessIterator first, RandomAccessIterator last, 
  78.                    Compare comp ); 
  79. //eg: 
  80.  
  81. *************************************************************************************/  
  82.   
  83. template<typename T>  
  84. void Print(T& V)  
  85. {  
  86.     typename T::iterator iter=V.begin();  
  87.     while(iter != V.end())  
  88.     {  
  89.         cout<<*iter++<<” “;  
  90.     }  
  91.     cout<<endl;  
  92. }  
  93.   
  94. int main()  
  95. {  
  96.     vector<int> ivec;  
  97.     for(int i=3;i<=7;++i)  
  98.         ivec.push_back(i);  
  99.     for(int i=5;i<=9;++i)  
  100.         ivec.push_back(i);  
  101.     for(int i=1;i<=4;++i)  
  102.         ivec.push_back(i);  
  103.     cout<<“原数据:”;  
  104.     Print(ivec);  
  105.   
  106.     make_heap(ivec.begin(),ivec.end());//做最大堆排序,其实还在vector容器内  
  107.     cout<<“堆排后:”;  
  108.     Print(ivec);  
  109.   
  110.     pop_heap(ivec.begin(),ivec.end());//删除最大堆,其实是把数据放到最后了!  
  111.     cout<<“删除后:”;  
  112.     Print(ivec);  
  113.     ivec.pop_back();  
  114.   
  115.     pop_heap(ivec.begin(),ivec.end());//删除最大堆,其实是把数据放到最后了!  
  116.     cout<<“删除后:”;  
  117.     Print(ivec);  
  118.     ivec.pop_back();  
  119.   
  120.     ivec.push_back(15);  
  121.     cout<<“添加数据后:”;  
  122.     Print(ivec);  
  123.   
  124.     push_heap(ivec.begin(),ivec.end());//放入最大堆,其实是把新加入的数据,按照堆排加入堆内  
  125.     cout<<“把最后一个数加入堆里:\n”;  
  126.     Print(ivec);  
  127.   
  128.     sort_heap(ivec.begin(),ivec.end());//把堆排顺序,还原成一般的排序算法  
  129.     cout<<“还原堆排顺序:\n”;  
  130.     Print(ivec);  
  131.   
  132.     return 0;  
  133. }  


[cpp] 
view plain
 copy

  1. /***************************************** 
  2. //Output: 
  3. 原数据:3 4 5 6 7 5 6 7 8 9 1 2 3 4 
  4. 堆排后:9 8 6 7 7 5 5 3 6 4 1 2 3 4 
  5. 删除后:8 7 6 7 4 5 5 3 6 4 1 2 3 9 
  6. 删除后:7 7 6 6 4 5 5 3 3 4 1 2 8 
  7. 添加数据后:7 7 6 6 4 5 5 3 3 4 1 2 15 
  8. 把最后一个数加入堆里: 
  9. 15 7 7 6 4 6 5 3 3 4 1 2 5 
  10. 还原堆排顺序: 
  11. 1 2 3 3 4 4 5 5 6 6 7 7 15 
  12.  
  13. *****************************************/  
    原文作者:排序算法
    原文地址: https://blog.csdn.net/u010949971/article/details/62873562
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞