以下方法是倒叙排序
void HeapSort(int * a, int size )
{
//首先将数组堆化
int i;
for(i=1; i<size ; ++i)
{
//i=1时,表示往堆里增加了一个元素
int index = i;
while(index>0)
{
int pindex = (index-1)/2; //求出父节点下标
if(a[pindex] > a[index] )
{
a[pindex]=a[pindex]^a[index];
a[index]=a[pindex]^a[index];
a[pindex]=a[pindex]^a[index];
index=pindex;//继续检查堆的合法性
}
else
break;
}
}
//删除头节点,放到尾部
for(i=0; i<size-1 ; ++i)
{
int tail=size-1-i;
int head = 0;
a[tail]=a[tail]^a[head];
a[head]=a[tail]^a[head]
;
a[tail]=a[tail]^a[head];
int heapsize=tail;
while(1)
{
int left=head*2+1;
int right=head*2+2;
int x;
if(left>=heapsize)
break;
if(right>=heapsize)
x=left;
else
{
if(a[left]<a[right])
x=left;
else
x=right;
}
if(a[head]>a[x])
{
a[head]=a[head]^a[x];
a[x]=a[head]^a[x];
a[head]=a[head]^a[x];
head=x;
}
else
break;
}
}
}