![]()
1 /**
2 * 排序算法之堆排序
3 **/
4 #include <iostream>
5 #include <cstdio>
6 #include <cstring>
7 #include <algorithm>
8 #include <vector>
9 using namespace std;
10
11 void adjust(vector<int>& vec, int len, int index) {
12 int left = 2 * index + 1;
13 int right = 2 * index + 2;
14 int maxIdx = index; //代表父子三个数中最大数的下标
15 if (left < len && vec[left] > vec[maxIdx]) maxIdx = left;
16 if (right < len && vec[right] > vec[maxIdx]) maxIdx = right;
17 if (maxIdx != index) {
18 swap(vec[maxIdx], vec[index]);
19 adjust(vec, len, maxIdx);
20 }
21
22 }
23
24 void heapSort(vector<int>& vec, int size) {
25 for (int i = size / 2 - 1; i >= 0; i--) {//从最后一个非叶节点开始进行堆调整
26 adjust(vec, size, i);
27 }
28
29 for (int i = size - 1; i >= 1; i--) {
30 swap(vec[0], vec[i]);
31 adjust(vec, i, 0);
32 }
33
34 }
35
36 int main() {
37 vector<int> vec = {2,1,3,5,4};
38 int len = vec.size();
39 heapSort(vec, len);
40 for (auto x : vec) {
41 cout << x << endl;
42 }
43 return 0;
44 }