//从上往下调整,有孩子的结点会被全部调整
void Biud(ElemType A[],int len){
for(int i=len/2;i>0;i--){
Adjust(A,i,len);
}
//i往下的结点都会被调整
void Adjust(ElemType A[],int k,int len){
A[0]=A[k];
for(int i=2*k;i<=len;i*=2){ //从i往下比
if(i<len&&A[i]<A[i+1]) //对比孩子 *相等的节点也会被交换
i++;
if(A[0]>=A[i]) break; //孩子中较大的结点与根节点对比
else{
A[k]=A[i]; //根结点与孩子较大的交换
k=i; //修改k值,令其为下一个小子树的根节点位置
}
}
A[k]=A[0]; //最后变动的位置放上根结点
}
//堆排序算法
void HeapSort(ElemType A[],int len){
//O(n)
Build(A,len); //初始建堆
//O(nlog2n)
for(int i=len;i>1;i--){ //n-1趟交换和调整
Swap(A[i],A[1]); //输出堆顶元素
Adjust(A,1,i-1); //向下调整
}
}
堆排序 | O(nlog2n) 增序大根堆
最新推荐文章于 2024-06-14 14:44:45 发布