堆排序基本思想
将待排序的序列构造成一个大顶堆,此时整个序列的最大值就是堆顶的根节点,将其移走(即与**堆数组**的末尾元素交换,此时末尾元素就是最大值),然后将剩余n-1个序列重新构造成一个大顶堆,重复此过程,得到一个有序序列。
一个无序顺序表的堆排序过程:
void HeapSort(SqList *L)
{
int i;
for(i=L->length/2;i>0;i--) //将无序表L构造成一个大顶堆
{
HeapAdjust(L,i,L->length);
}
for(i=L->length;i>1;i--)
{
swap(L,1,i); //将当前记录与最后一个记录交换
HeapAdjust(L,1,i-1); //将剩余部分L->r[1…i-1]重新调整为一个大顶堆
}
}
void HeapAdjust(SqList *L,int s, int m)
{
int temp,j;
temp = L->r[s];
for(j=2*s; j<=m; j*=2)
{
if(j<m && L->r[j]<L->r[j+1])
{
++j;
}
if(temp>=L->r[j])
break;
L->r[s]=L->r[j];
s=j;
}
L->r[s]=temp;
}
堆排序的最好、最坏和平均时间复杂度均为O( nlog n),远好于冒泡、简单选择、直接插入的O( n*n)时间复杂度。