排序算法总结——堆排序

本文详细介绍了堆排序的算法原理,包括大顶堆和小顶堆的性质,以及如何构建初始堆和调整堆。通过具体步骤展示了升序堆排序的过程,并分析了构建初始大顶堆和堆调整的时间复杂度,最后讨论了堆排序的稳定性。
摘要由CSDN通过智能技术生成

1.算法原理及步骤

2.实现代码

3.时间复杂度分析

3.1 构建初始大顶堆时间复杂度

3.2 堆调整时间复杂度

补充说明

4. 稳定性分析 


1.算法原理及步骤

       要搞清楚堆排序,首先就需要明白什么是堆,在堆排序中,堆是一种类似于完全二叉树的结构,那么完全二叉树是什么呢?简单来讲,完全二叉树就是指叶子结点只存在于最后两层的树。而堆排序则是利用这一数据结构进行排序,排序的方法主要分为两种:大顶堆排序和小顶堆排序,其中大顶堆用于排升序小顶堆用于排降序

       其中,大顶堆的性质是:每一个子堆中(包含一个结点及其左右子结点(若有)),结点值是最大值;

                  小顶堆的性质是:每一个子堆中(包含一个结点及其左右子结点(若有)),结点值是最小值;

       不管是大顶堆还是小顶堆,都不用明确左右子结点间的大小关系。假设结点索引为i(i=0,1,2...),那么其左右结点索引分别为2*i+1和2*i+2,对于大顶堆a[i]≥a[2*i+1]&&a[i]≥a[2*i+2];对于小顶堆有a[i]≥a[2*i+1]&&a[i]≤a[2*i+2]。如下图所示:

       需要注意的是,堆排序并非是真正的在树中进行排序,它只是利用了树的性质,将数组中的各元素看做是按序分布在树上的结点,实际上还是在数组内部进行排序的。

       以升序为例,先将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了。

       因此,以升序为例,堆排序的步骤分为以下几步:

       ①构造初始堆,将无序数组构造成大顶堆形式;

       假定给定数组如下,其对应的堆结构如图所示:

       此时的堆结构并非是大顶堆,因此需要对其进行调整。需要注意的是,叶子结点是没有子结点的,不用对其进行调整,因此就从最后一个非叶子结点开始从下往上调整。那么最后一个非叶子结点怎么找呢?很简单,知道了数组的长度为len,那么最后一个非叶子结点的索引必定就是[len/2]-1(其中[len/2]表示对[len/2]向下取整),即是从图中的结点6(索引为1)开始,此时发现结点6比其右子结点9小,因此就将结点6与结点9交换,如图所示:

        然后就继续遍历从下往上,从

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值