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

堆排序是一种基于完全二叉树的排序算法,由Floyd和Williams在1964年提出。它通过构建大顶堆(或小顶堆)来实现O(nlogn)的平均时间复杂度。堆排序过程包括构造初始堆、交换堆顶元素与末尾元素并重新调整堆等步骤。本文详细介绍了堆排序的思想、图解过程及Java代码实现。
摘要由CSDN通过智能技术生成

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,我们从左至右,从下至上进行调整。

堆是一颗完全二叉树,设某堆总共有n个节点,则最后一个非叶子节点的计算公式如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值