#include<iostream>
using namespace std;
#define Left 2*nRootID+1
#define Right 2*nRootID+2
void Adjust(int arr[],int nlen,int nRootID) //大根堆
{
int max;
for(max = Left;max<nlen;max = Left)
{
//有两个孩子
if(Right<nlen)
{
if(arr[Right]>arr[Left])
max = Right;
}
//大的和父亲比
if(arr[max]>arr[nRootID])
{
arr[max] = arr[max]^arr[nRootID];
arr[nRootID] = arr[max]^arr[nRootID];
arr[max] = arr[max]^arr[nRootID];
nRootID = max;
continue;
}
else
{
break;
}
}
}
void heapSort(int arr[],int nlen)
{
if(arr == NULL||nlen<=0) return;
//构建初始堆
int i;
for(i=nlen/2-1;i>=0;i--)
{
Adjust(arr,nlen,i); //因为对于节点如果为0-n的话 父亲节点范围为0-nlen/2-1 从最后一个节点进行调整
}
//排序
for(i=nlen-1;i>0;i--)
{
//交换
arr[i] = arr[i]^arr[0];
arr[0] = arr[i]^arr[0];
arr[i] = arr[i]^arr[0];
Adjust(arr,i,0); //调整堆顶
}
}
int main()
{
int arr[] = {3,1,27,6,5};
heapSort(arr,sizeof(arr)/sizeof(arr[0]));
for(int i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
cout<<arr[i]<<" ";
}
cout<<endl;
system("pause");
return 0;
}