过程:
1、数组可以看成层序遍历的一颗二叉树,先将二叉树转化为大顶堆形式的二叉树(也就是数组重新排个序)
2、对大顶堆的二叉树进行操作,将顶堆和尾部相交换,顶堆最大的数据就拿出来放在数组最后了。再将剩下的n - 1重新排成大顶堆形式,重复递归操作。
代码:
#include <iostream>
#include <vector>
using namespace std;
class solution {
public:
void heapSort(vector<int> &array) {
for (int i = array.size() / 2; i >= 0; i--) {
heapJust(array, i, array.size() - 1);
}
for (int i = array.size() - 1; i > 0; i--) {
swap(array[0], array[i]);
heapJust(array, 0, i - 1);
}
}
void heapJust(vector<int> &array, int start, int end) {
int temp = array[start];
int j = 0;
for (j = 2 * start; j <= end; j *= 2) {
if (j < end && array[j] < array[j + 1]) {
j++;
}
if (temp >= array[j]) {
break;
}
array[start] = array[j];
start = j;
}
array[start] = temp;
}
};
int main() {
solution solo;
vector<int> array = { 6,3,2,1,8,7,5,9,4 };
solo.heapSort(array);
for (auto i : array) {
cout << i << endl;
}
}