堆排序的原理及代码实现

堆排序原理

1)堆的定义

堆(二叉堆)可以看作是一棵完全二叉树,即除了最后一层,每一层都是满的。这个性质使我们可以用一个数组来存储一个堆。如图是二叉树在数组中的存储。
在这里插入图片描述

2)大顶堆和小顶堆

大顶堆:每个节点的都值大于或等于其左右孩子的值的堆,如图:
在这里插入图片描述

小顶堆:每个结点的值都小于或等于其左右孩子的值的堆,如图:
在这里插入图片描述

3)堆排序的实现过程

堆排序就是将一个无序的数组中的元素看作是一个无序堆,然后将这个无序堆维护成一个有序的大顶堆或小顶堆。这样就可以在顶部产生出一个最大值或最小值。然后把顶部的值与最后一个值进行交换,交换后断开最后1个元素,对剩下的数继续进行维护,交换,断开。重复以上过程,直到最后一个元素。
一个无序的数组就变成了一个有序的数组。堆排序实现的平均时间复杂度为O(nlogn)。
升序采用大顶堆
降序采用小顶堆
以下我将用大顶堆做升序示例:

如图的一个数组从最后一个元素开始维护,第一个需要维护的是12,12比它的左结点小,所以我们让12和35交换由于左节点没有字节点所以不用在维护。
在这里插入图片描述
接着是23比左节点78小,23和78交得到
在这里插入图片描述

交换后23比左节点小继续维护得到
在这里插入图片描述
交换后26比右节点小,交换得
在这里插入图片描述
然后45比78小,45和78交换
在这里插入图片描述

交换后45比67小,45和67交换
在这里插入图片描述

此时大顶堆完成,交换第一个和最后一个,断开最后一个(数组减一)。
在这里插入图片描述

重复以上过程可以完成数组升序排列。

4)实现代码及示例

功能函数:

void swap(int *a,int *b)//实现两个数据交换
{
   
        int tem;
        tem=*a;
        *a
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值