堆排序--c语言

/*************************************************************************
    > File Name: 6-堆排序.c
    > Author:
    > Mail:
    > Created Time: Wed 16 Mar 2022 09:02:27 AM CST

堆排序思路;

把数组看成二叉树,由上往下,由左往右作为数组位置例如:int a[]={2,0,4,5,6,0};
    ┊   ┊   2
    ┊   0       4
    ┊5    6  0
由下往上构建大根堆:即让父节点大于等于孩子节点,所以构建大根堆之后,根节点数值最大,把根节点值和最后节点交换,
由根节点往下调整关系,再次让根节点为最大值,再和倒数第二个交换,不断循环......


************************************************************************/

#include<stdio.h>
#include<stdlib.h>
#include<time.h>


void AudjctHeapSort(int*a,int root,int end )
{
    int child;
    int tmp=a[root];
    for(;2*root+1<=end;root=child)//循环条件表示:                                                                                                                      在有孩子下,比较父子大小,比较完成后,把root位置(父节点)改到孩子位置上,这样就可以确保修改父节点,同时也会去检查、修改下面的节点
    {
    ┊   child=2*root+1;//左孩子if(child+1<=end && a[child]<a[child+1])//右孩子存在,并且左孩子小于右孩子,child++,即右孩子,没有右孩子的话下面代码就是左孩子和父节点比较{
    ┊   ┊   child++;}if( a[child]>a[root] )//如果上面的左孩子没有小于右孩子,child表示的左孩子,反之右孩子,孩子和父节点比较,孩子大于父节点就父子交换值{
    ┊   ┊   a[root]=a[child];
    ┊   ┊   a[child]=tmp;}
    }
}


void HeapSort(int *a,int len)
{
    int i;
    for(i=len/2-1;i>=0;i--)
    {AudjctHeapSort(a,i,len-1);//由下往上构建大根堆
    }
    for(i=len-1;i>0;i--)
    {int tmp=a[i];//堆顶元素依次和最后一个、倒数第二、、、、交换位置
    ┊   a[i]=a[0];
    ┊   a[0]=tmp;AudjctHeapSort(a,0,i-1);//由堆顶往下调整大根堆,i-1表示,修改倒数第二个元素作为最后一个元素
    }
}


int main()
{

    int a[]={2,0,4,5,6,0};
    HeapSort(a,sizeof(a)/sizeof(int));
    for(int i=0;i<sizeof(a)/sizeof(int);i++)
    {printf("%d ",a[i]);
    }
    printf("/n");
return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不知道起个啥名“”

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值