堆排序——对简单选择排序的优化

1. 堆排序概述

  • 堆排序 Heap Sort是对简单选择排序的优化:选择排序是在待排序的 i i i个中选择最小(或最大)的数,交换到数组前面来,每次都需要比较 i − 1 i-1 i1次,如果在确保每次都能够选择最小(或最大)数的同时,对每次比较结果进行调整,那么排序的效率会有更大的提升,堆排序正是做这样的事情。
  • 堆排序算法是FloydWilliams在1964年共同发明的,同时,他们发明了“堆”这样的数据结构:
    • :堆是某一节点都小于(或都大于)左右子树的完全二叉树。
    • 堆排序的最坏、最好、平均时间复杂度均为 O ( n l o g n ) O(nlogn) O(nlogn),也是不稳定排序
    • 堆的分类
      • 大顶堆:节点大于左右子树
      • 小顶堆:节点小于左右子树
        在这里插入图片描述

如果按照层序遍历的方式给节点从1开始编号,则节点之间满足如下关系:
在这里插入图片描述
如果堆是数组顺序存储的:
在这里插入图片描述

2. 堆排序思想

  • 堆排序的基本思想如下(以升序为例):
    • 步骤一:将待排序的数组构造成一个大顶堆,此时数组的最大值就是大顶堆的根节点
    • 步骤二:将根节点和末尾元素进行交换,此时末尾元素就是最大值
    • 步骤三:去掉此末尾元素(已排序好),将 n − 1 n-1 n1个元素重新按步骤一排序
    • 按以上如此反复执行,就能够得到升序的数组了

3. 图解堆排序

假设有一个数组 { 4 , 6 , 8 , 5 , 9 } \{4, 6, 8, 5, 9\} { 4,6,8,5,9},要求使用堆排序法,将数组升序排序
步骤一:构造初始堆,按要求将给定无序数组构造成一个大顶堆。

  1. 初始无序数组结构如下:
    在这里插入图片描述
  2. 此时我们从最后一个非叶子节点开始(我们的目标是大顶堆的根节点,非叶子节点自然不用调整),最后一个非叶子节点的计算公式是 a r r . l e n g t h 2 − 1 \frac{arr.length}{2}-1 2arr.length1,我们从左至右,从下至上进行
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值