时间复杂度为O(nlogn),思路就是从最后一个非叶结点开始,依次往回遍历每个结点,将以该结点为根的子树建立成大根堆,直到遍历到整棵完全二叉树的根结点时为止,此时整棵树为大根堆。
以当前结点为根的子树建立大根堆:
//向下调整,将该结点的子树变成大根堆
void AdjustDown(int A[],int k,int len){ //k为根结点编号,len为数组长度
int i,j;
A[0]=A[k];
for(j=2*k;j<=len;j*=2){
if(j<len&&A[j]<A[j+1]) //右孩子较大
j++;
if(A[0]<A[j]){
A[k]=A[j];
k=j;
}
else break;
}
A[k]=A[0];
}
堆排序算法:
//堆排序算法
void HeapSort(int A[],int len){
int i,temp;
for(i=len/2;i>=1;i--) //建立初始大根堆
AdjustDown(A[],i,len); //从len/2到1,反复调整堆
for(i=len;i>1;i--){
temp=A[1];
A[1]=A[i];
A[i]=temp; //把最大的元素放到了最后面,最终排序结果为由小到大
AdjustDown(A[],1,i-1); //把剩余i-1个元素整理成堆
}
}
这样排序的结果为由小到大!
如果插入元素的话,直接插入到最后的位置,然后将插入的元素向上调整,直到整棵树再次变成大根堆时为止!
向上调整的代码:
//插入元素到最后位置,需要向上调整建立大根堆
void AdjustUp(int A[],int len){
A[0]=A[len];
int i=len/2,j=len;
while(i>0&&A[i]<A[0]){
A[j]=A[i]; //双亲结点下调
j=i;
i/=2; //继续向上比较
}
A[j]=A[0];
}
标签:大根堆,结点,为例,int,堆排序,len,为根 来源: https://blog.csdn.net/KK_2018/article/details/110377395
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。