#include "stdafx.h"
#include <iostream>
#include <assert.h>
using namespace std;
//对于a来说,除了a[s]之外均满足大顶堆的定义
// 该函数将下标 s到m 调整为大顶堆
void heapAdjust(int* a,int s, int m)
{
int temp = a[s];
// 下标从0开始,则两个孩子分别为 2*i+1 和 2*i+2
for(int j=2*s+1; j<=m; j=j*2+1)
{
// 执行完成后j中保存了两个孩子中较大的孩子的下表
// 如果j=m,说明m是最后的左孩子
if(j<m && a[j] < a[j+1])
j++;
if(temp>=a[j])// s就是要插入的位置
break;
//否则进行调整,将孩子中较大的孩子,放入s的位置
// 并将j赋值给s
a[s] = a[j];
s = j;
}
a[s] = temp;
}
int main()
{
int a[] = {49,38,65,97,76,13,27,49};
int length = sizeof(a)/sizeof(a[0]);
// 从最后一个没有孩子的节点进行调整,建立大顶推
for(int i= (length-1)/2 ; i>=0; i--)
heapAdjust(a,i,length-1);
// 将堆顶元素和最后一个元素进行交换
// 之后,重新调整堆
// 完成之后,就是 从小到大的排序
for(int i = length-1; i>0; i--)
{
int temp = a[0];
a[0] = a[i];
a[i] = temp;
heapAdjust(a,0,i-1);
}
for(int i=0; i<length; i++)
cout<<a[i]<<endl;
}