代码
#include <stdio.h>
int a[9] = {-1,55,17,78,9,45,65,87,32};
void BulidMaxHeap(int a[],int len);//传入原始序列,从下标1开始,len为有效长度
void HeadAdjust(int a[],int k,int len);
void HeapSort(int a[],int len);
void Swap(int &a,int &b);
void display(int a[],int len);
int main(){
printf("原序列为: ");
display(a,8);
HeapSort(a,8);
printf("经过大根堆排序后的序列为: ");
display(a,8);
return 0;
}
void BulidMaxHeap(int a[],int len){
for(int i=len/2;i>0;i--)//从i=n/2~1不断调整大根堆
HeadAdjust(a,i,len);
}
void HeadAdjust(int a[],int k,int len){//将元素a[k]为根的子树进行大根堆的调整
a[0]=a[k];//用a[0]暂存a[k]
for(int i=2*k;i<=len;i*=2){//2*k为左子树
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(int a[],int len){
BulidMaxHeap(a,len);//初始堆
for(int i=len;i>1;i--){//n-1趟的交换和建堆
Swap(a[i],a[1]);//对于每一趟的建堆,根结点(a[1])已为堆最大值,我们将其放置在最后并将len--
HeadAdjust(a,1,i-1);
}
}
void Swap(int &a,int &b){
int temp=a;
a=b;
b=temp;
}
void display(int a[],int len){
for(int i=1;i<=len;i++)
printf("%d\t",a[i]);
printf("\n");
}
结果