//堆排序算法,调整为大顶堆
void Heapsort(sqlist &L)
{
int i;
for(i=L.length/2;i>0;i--)//对非终端结点构造堆
Heapadjust(L,i,L.length);
//接下来进行调整
for(i=L.length;i>0;i--)
{
swap(L,1,i);//将堆顶记录与当前未经排序子序列的最后一个记录交换。
Heapadjust(L,1,i-1);//对前n-1个元素进行堆调整
}
}
//调整r.[s]使r.[s...m]是一个大顶堆
void Heapadjust(sqlist &L,int s,int m)//传入堆调整的起始位置和结束位置
{
temp=L. r[s];
for(j=2*s;j
if(j
break;
else
{
L.r[s]=L.r[j];//否则的话就把孩子的这个较大的值放到子二叉树根节点的位置
s=j;//此时s的位置就被调整到了下面
}
}
L.r[s]=temp;
//每次循环结束后,用原来子二叉树根节点的元素代替子树中换到根结点的原来那个孩子结点的位置,完成交换工作
}
//堆排序的时间复杂度是O(nlogn),额外空间复杂度O(1),是一个不稳定排序



