堆排序浅学

堆排是选择排序的一种,也就是首先选择一个值最大或最小的元素加到有序序列,
先了解一个堆这个结构:
在这里插入图片描述
如果拍好序列,逻辑视角就是顺序存储的完全二叉树,(大根)满足根结点的值大于左右结点的值在这里插入图片描述
对所有的非终端节点(非叶子结点)进行处理(从数组最右端也就是逻辑结构的树的最下面的非终端结点(从上到下)处理)上代码

void HeadAjust(int a[],int k,int n){
    a[0]=a[k];                            //存起来此非叶子结点
    for(int i=2*k;i<=n;i=i*2){            //找的此结点的左孩子结点
        if(i<n&&a[i]<a[i+1])             //比较左右孩子结点的大小,i指向值大的
            i++;
        if(a[0]>=a[i]) break;              //如果根节点大于左右孩子结点跳出完成此非终端节点的大根堆调正
        else{                               //要不然就把左右孩子值大的赋值给根

            a[k]=a[i];
            k=i;                            //并且让k指向i的位置等待下次循环比较此结点的孩子的孩子结点完成此结点之下的所有结点符合大根堆特性
        }
    }
     a[k]=a[0];           //找出的位置赋值
}
void BuildDui(int a[],int n){
    int i;
for(i=n/2;i>0;i--){       //首次建立大根堆
  HeadAjust(a,i,n);}
}

void heapSort(int a[],int n){
 BuildDui(a,n);
 for(int i=n;i>1;i--){
    wap(a[i],a[1]);                   //每次找出大根的值为树的根节点都和最后一个位置的结点交换位置
    HeadAjust(a,1,i-1);        //依次调整大根堆
 }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值