堆排序
作者:互联网
#include<stdc++.h>
using namespace std;
void BuildMaxHeap(int a[],int len);
void Headjust(int a[],int k,int len);
void HeapSort(int a[],int len);
//从最大序号的非终端结点开始自下至上进行调整,建堆
void BuildMaxHeap(int a[],int len){
for(int i=len/2;i>0;i--)
Headjust(a,i,len);
}
//调整以k为根的子树
void Headjust(int a[],int k,int len){
a[0]=a[k];
for(int i=2*k;i<=len;i*=2){
if(i<len && a[i]<a[i+1])
i++;
if(a[0]>=a[i]) break;
else{
a[k]=a[i]; //这里不是交换,大元素上移,小元素待定放在a[0],减少交换次数
k=i;
}
}
a[k]=a[0]; //将小元素下坠到指定位置
}
//堆排序
void HeapSort(int a[],int len){
BuildMaxHeap(a,len);
for(int i=len;i>1;i--){
swap(a[1],a[i]);
Headjust(a,1,i-1);
}
}
int main()
{
int a[]={0,1,13,2,44,93}; //a[0] 仅作辅助空间,不是堆元素
//验证将一个顺序存储的完全二叉树转换成大根堆
Headjust(a,1,5);
for(int i=1;i<=5;i++)
cout<<a[i]<<" ";
puts("");
//验证堆排序
HeapSort(a,5);
for(int i=1;i<=5;i++){
cout<<a[i]<<" ";
}
return 0;
}
标签:BuildMaxHeap,int,void,元素,堆排序,len,Headjust 来源: https://www.cnblogs.com/rabbithacker/p/16357084.html