#include <iostream>
using namespace std;
void swap(int &a,int &b)
{
if(a!=b)
{
a^=b;
b^=a;
a^=b;
}
}
void HeapAdjust(int *unsorted,int parent,int len)
{
int tmp=unsorted[parent];
int child=2*parent+1;
while(child<len)
{
if(child+1<len && unsorted[child]<unsorted[child+1]) //如果存在右孩子,判断左孩子是否小于右孩子
child++;
if(tmp>=unsorted[child]) //父节点大于等于子节点,则无需交换
break;
unsorted[parent]=unsorted[child];
parent=child;
child=2*parent+1;
}
unsorted[parent]=tmp;
}
void heap_sort(int *unsorted,int len)
{
for(int i=len/2-1;i>=0;i--) //n/2-1 表示堆中父节点的个数
{
HeapAdjust(unsorted,i,len);
}
for(int i=len-1;i>0;i--)
{
swap(unsorted[0],unsorted[i]); //堆顶与当前堆的第i个元素进行值对调
HeapAdjust(unsorted,0,i); //两值交换,可能破坏根堆,需重新构造堆
}
}
int main()
{
int array[]={36,115,24,63,42,21,5,11},i;
int size=sizeof(array)/sizeof(array[0]);
cout<<"排序前:";
for(i=0;i<size;i++)
cout<<array[i]<<" ";
cout<<endl;
heap_sort(array,size);
cout<<"排序后:";
for(i=0;i<size;i++)
cout<<array[i]<<" ";
cout<<endl;
return 0;
}