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 }