参考《大话数据结构》P399
//堆排序的时间复杂度为O(NlogN),在性能上显然远好于冒泡,简单选择,直接插入的O(n²)的时间复杂度
//不过由于记录的比较与交换是跳跃式进行,因此堆排序是一种不稳定的排序方法
/**将该节点及以下的子节点排成一个最大堆*/
void HeapAdjust(int* a, int i, int size){
int temp;
int j;
temp = a[i];
for (j = 2*i; j <= size; j*=2)
{
if(j<size && a[j]<a[j+1])
{
++j;
}
if(temp>=a[j])
{
break;
}
a[i] = a[j];
i = j;
}
a[i] = temp;
}
/**对数组进行堆排序*/
void HeapSort(int* a, int size)
{
int i;
//先将待排序的序列构造成一个大顶堆,堆顶的根节点为最大值
for (i = size/2; i>0; i--)
{
HeapAdjust(a, i, size);
}
//将堆顶的值与堆数组末尾的元素交换,将剩下的n-1个序列构造成一个堆
for(i=size; i>1; i--)//a[0]存放的是“哨兵”
{
swap(a[1],a[i]);
HeapAdjust(a, 1, i-1);
}
}
堆排序大概就两点:1.先将无序序列的排成最大堆 2.将最大堆的堆顶与末尾交换,剩下的再排成最大堆