本排序是利用大顶堆排序。基本思想:整个序列的最大值就是堆顶的根节点。将它移走(其实就是讲其与堆数组的末尾元素交换,此时末尾元素就是最大值)。然后将剩余的n-1个序列重新构造成一个堆,这样就会得到n个元素中的次大值。如此反复执行,便能得到一个有序序列了。
#define MAXSIZE 10
typedef struct
{
int r[MAXSIZE+1];
int length;
}Sqlist;
void swap(Sqlist *L, int i, int j)
{
int temp = L->r[i];
L->r[i] = L->r[j];
L->r[j] = temp;
}
void HeapSort(Sqlist *L)
{
int i;
for (i = L->length/2; i > 0; i--)
HeapAdjust(L, i, L->length);
for (i = L->length; i > 1; i--)
{
swap(L, 1, i);
HeapAdjust(L, 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;
}