大根堆的堆排序

代码

#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");
}

结果

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值