堆排序,push() , pop() , make_heap() , sort_heap()

  1 #include<stack>
  2 #include<list>
  3 #include<iostream>
  4 #include<algorithm>
  5 #include<deque>
  6 #include<vector>
  7 using namespace std;
  8 
  9 void pop_heap(vector<int>& a) { //向下沉
 10     int len = a.size();
 11     if (len <= 1) {
 12         cout << a.back() << " ";
 13         a.pop_back();
 14         return;
 15     }
 16 
 17     int workNum = a[len - 1];
 18     a[len - 1] = a[0];
 19     len--;
 20     int index = 0;
 21     int left = index * 2 + 1;
 22     int right = index * 2 + 2;
 23     while (left<len) {
 24         int aim = left;
 25         if (right<len && a[right]>a[left]) {
 26             aim = right;
 27         }
 28         if (a[aim] > workNum) {
 29             a[index] = a[aim];
 30             index = aim;
 31             left = index * 2 + 1;
 32             right = index * 2 + 2;
 33         }
 34         else {
 35             break;
 36         }
 37     }
 38     a[index] = workNum;
 39     cout << a.back()<<" ";
 40     a.pop_back();
 41 }
 42 
 43 void push_heap(vector<int>& a) {    //向上浮
 44     int len = a.size();
 45     int workNum = a[len - 1];
 46     int index = len - 1;
 47     int parent = (index - 1) / 2;
 48         
 49     while (parent>=0 && a[parent] < workNum) {
 50         a[index] = a[parent];
 51         index = parent;
 52         parent = (parent - 1) / 2;
 53     }
 54     a[index] = workNum;
 55 }
 56 
 57 void make_heap(vector<int>& a) {    //向下沉
 58     int len = a.size();
 59     int notLeaf = (len - 2) / 2;
 60 
 61     for (int i = notLeaf; i >= 0; i--) {
 62         int tempIndex = i;
 63         int workNum = a[i];
 64 
 65         while (tempIndex <= notLeaf) {
 66             int left = tempIndex * 2 + 1;
 67             int right = tempIndex * 2 + 2;
 68             int aim = left;
 69             if (right < len && a[right]>a[left]) {
 70                 aim = right;
 71             }
 72             if (workNum < a[aim]) {
 73                 a[tempIndex] = a[aim];
 74                 tempIndex = aim;
 75             }
 76             else {
 77                 break;
 78             }
 79         }
 80         a[tempIndex] = workNum;
 81     }
 82 }
 83 
 84 void sort_heap(vector<int>& a) {
 85     while (a.size()) {
 86         pop_heap(a);
 87     }
 88 }
 89 
 90 int main(void) {
 91 
 92     vector<int> ivec = { 0,1,2,3,4,8,9,3,5 };
 93     make_heap(ivec);
 94     for (auto h : ivec)
 95         cout << h << " ";
 96     cout << endl;
 97 
 98     ivec.push_back(7);
 99     push_heap(ivec);
100 
101     for (auto h : ivec)
102         cout << h << " ";
103     cout << endl;
104 
105     pop_heap(ivec);
106     
107     cout << endl;
108 
109     sort_heap(ivec);
110 
111     return 0;
112 }

 

posted @ 2020-11-08 19:57  czhWellOptimized  阅读(146)  评论(0)    收藏  举报