#include <iostream>
using namespace std;
void HeapAdjust(int arr[],int s,int m)//大顶堆,m表示最后一个数字位置,s表示第一个位置,都是下标
{
int cur=s;
int index;
int tmp=arr[cur];
while(cur*2+1<=m)
{
index=cur*2+1;//left child
if(index<m&&arr[index]<arr[index+1])
{
index++;//right child
}
if(arr[cur]<arr[index])
{
arr[cur]=arr[index];
arr[index]=tmp;
cur=index;
}
else
{
break;
}
}
}
void HeapSort(int arr[],int size)//表示数组中元素的个数
{
int arrSize=size;//(arrSize-1-1)/2表示最后一个父节点
for(int i=(arrSize-1-1)/2;i>=0;i--)
{
HeapAdjust(arr,i,arrSize-1);
}
swap(arr[0],arr[size-1]);
for(int i=arrSize-1-1;i>0;i--)
{
HeapAdjust(arr,0,i);
swap(arr[0],arr[i]);
}
}
int main()
{
int arr[]={3,6,4,8,1,4,3,5,23,4324,5435,6546,76573,453,546,765,8768,987,654};
HeapSort(arr,19);
for(int i=0;i<19;i++)
cout<<arr[i]<<" ";
getchar();
return 0;
}