堆排序(heap sorting)是利用堆(大根堆)的特性进行排序的过程。堆排序包括构成初始堆和利用堆排序这两个阶段。假定待排序的n个元素存放于一维数组中,则对A[i]进行筛运算的算法描述为:
void Sift(ElemType A[],int n, int i)
//对A[n]数组中的A[i]元素进行筛运算,假定以A[i+1]
//至A[n-1]的每一个元素为根的子树已经成为堆
{
ElemType x=A[i]; //把待筛结点的值暂存于x中
int j=2*i+1; //A[j]是A[i]的左孩子
while(j<=n-1){ //当A[i]的左孩子不为空时执行循环
if(j<n-1 && A[j].stn<A[j+1].stn) j++; //若右孩子的排序码较大,则把j修改为右孩子的下标
if(x.stn<A[j].stn){
A[i]=A[j]; //将A[j]言调到双亲位置上
i=j; j=2*i+1; //修改i和j的值,以便继续向下筛
}
else break; //查找到x的最终位置,终止循环
}
A[i]=x; //被筛结点的值放入最终位置
}
堆排序的算法描述为:
void HeapSort(ElemType A[], int n)
//利用堆排序的方法对数组A中的n个元素进行排序
{
ElemType x;
int i;
for(i=n/2-1; i>=0; i--) Sift(A,n,i); //建立初始堆
for(i=1; i<=n-1; i++){ //进行n-1次循环,完成堆排序
x=A[0]; A[0]=A[n-1]; A[n-1]=x; //将树根结点的值同当前区间内最后一个结点的值对换
Sift(A,n-1,0); //筛A[0]结点,得到n-i个结点的堆
}
}
堆排序的时间复杂度为O(nlog2n),它是一种不稳定的排序方法。