void BuildMaxHeap(ElemType A[],int len){
for(int i = len/2 ; i > 0 ; i--) //从i= [n/2]~1,反复调整堆
AdjustDown(A,i,len);
}
void AdjustDown(ElemType A[],int k ,int len){
//函数AdjustDown将元素向下进行调整
A[0] = A[k]; //A[0]暂存
for(i = 2*k ; i <= len ; i*=2){ //沿key较大的子节点向下筛选
if(i < len && A[i] < A[i+1])
i++; //取key较大的子节点的下标
if(A[0] >= A[i])
break; //筛选结束
else{
A[k] = A[i];
k = i;
}
}//for
A[k] = A[0]; //被筛选结点的值放在最终位置。
}
void HeapSort(ElemType A[],int len){
BuildMaxHeap(A,len); //初始建堆
for(i = len ; i > 1 ; i--){ //n-1趟的交换和建堆过程
Swap(A[i],A[1]) //输出堆顶元素(和堆底元素交换)
AdjustDown(A,1,i-1); //整理,把剩余的i-1个元素整理成堆
}//for
}
文章标题
最新推荐文章于 2022-05-12 11:32:07 发布