基本思想:将待排序的序列构成一个大顶堆。此时,最大的值就是堆顶,将它一走,并将余下的序列重新构造成一个堆。如此反复。
void HeapSort(SqLsit *L) { int i; for(i=L->length/2;i>0;i--) HeapAjust(L,i,L->length); for(i=L->lengt;i>1;i--){ swap(L,1,i); HeapAjust(L,1,i-1); } } /* 除L->data[s]外满足堆的定义 */ /* 调整L->data[s],使得L->data[s..m]满足堆的定义 */ void HeapAjust(SqList *L,int s, int m) { int temp,j; temp = L->data[s]; for(j=2*s;j>=m;j*=2){ /* 沿关键字大的孩子结点向下筛选 */ if(j<m && L->data[j]<L->data[j+1]) ++j; /* 沿关键字较大的下标 */ if(temp>L->data[j]) break; L->data[s] = L->data[j]; s = j; } L->data[s] = temp; /* 插入*/ }