七大排序算法——堆排序之原地堆排序(Java实现)


一、堆排序是什么?

基于二叉树的二叉堆的排序算法。给定一个任意数组,不创建任何的额外空间,就在这个数组上进行排序。堆排序是一个稳定的O(nlogn)时间复杂度的算法。

二、分析 与 实现

1.思路

  1. 任意数组其实可以看作是一个完全二叉树,我们首先将其调整称为最大堆(根节点>=所有的子节点,子树也满足最大堆的定义),也就是堆化heapfiy。
  2. 从最后一个非叶子节点开始进行sift Down操作。
  3. sift Down操作就是从当前二叉树中最后一个小子树开始调整,将当前子树不断调整为最大堆,最终走到树根时,左右子树已经全部为最大堆,只需下沉根节点就能得到到最终的最大堆。
  4. 当sift Down操作完成后此时的堆已经是一个最大堆,我们只需要不断地交换堆顶元素和最后一个元素的位置,将堆顶元素继续进行sift Down操作,这样最大值就放在了数组的末尾。
  5. 走完整个循环,数组已经是一个升序的数组。

2.分析

  1. 最后一个非叶子结点就是最后一个叶子节点的父节点。
  2. 假设此时结点的索引为 i ,且它存在父子结点。
  3. 那么它父节点的索引为:(i - 1) / 2 ;
  4. 左子树的结点为:(2 * i) + 1;
  5. 右子树的结点为:(2 * i) + 2;
  6. 堆化时是从最后一个非叶子节点开始进行siftDown操作,而将最大值放在数组末尾时 是从堆顶元素开始的sift Down操作。
  7. arr.length - 1代表的是最后一个叶子节点,最后一个叶子节点再-1 / 2就是它的父节点。此时我们开始堆化的操作调整为最大堆。
  8. 需要注意的是两个sift Down操作的位置不同,一个是从最后一个非叶子结点开始的最大堆化,一个是从堆顶开始的将堆顶最大值先交换到末尾,然后数组长度–,再进行sift Down操作,将一个新的最大值放到堆顶。

2.代码实现

代码如下:

public class SevenSort {
   
    public static void main(String[] args) {
   
        int[] arr = {
   19,27,
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值