#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
//很多heapsort排序算法是把向量的第一个节点空出来的,因此会与本人代码有些许出入,但是思想是差不多的
void HeapAdjust(vector<int> &data, int s, int m)
{
int temp, j;
temp = data[s];
for (j = 2 * s + 1; j <= m - 1; j = 2 *j + 1)
{
if (j <= m - 2 && data[j] < data[j + 1]) //找到孩子中较大的孩子
j++;
if (temp >= data[j]) //如果根节点比最大的孩子还大,则不需调整,退出循环
break;
data[s] = data[j]; //如果根节点比最大的孩子还小,最大孩子的值赋给根节点
s = j; //孩子节点变根节点,进入循环,往下继续寻找与调整
}
data[s] = temp; //注意这里本应为data[j] = temp 但是前面 s = j
}
void HeapSort(vector<int> & a)
{
int i;
int length = a.size();
//根据完全二叉树的节点特性,依次调整第i个非叶节点和子节点的结构,构建大顶堆
for (i = length / 2 - 1; i >= 0; i--)
{
HeapAdjust(a, i, length);
}
for (i = length - 1; i >= 2; i--)
{
swap(a[0], a[i]); //将根节点与底层最右边的叶节点互换
HeapAdjust(a, 0, i - 1); //从根结点开始,从上往下重新调整大顶堆,
}
}
int main()
{
vector<int> data = { 50,10,90,30,70,40,80,60,20 };
HeapSort(data);
for (int i = 0; i < data.size(); i++)
cout << data[i] << " ";
system("pause");
}