美文网首页
图解堆排序

图解堆排序

作者: Herman7z | 来源:发表于2021-03-17 10:31 被阅读0次

程序员常用的IDEA插件:https://github.com/silently9527/ToolsetIdeaPlugin

完全开源的淘客项目:https://github.com/silently9527/mall-coupons-server

微信公众号:贝塔学Java

前言

在上一篇中我们一起使用二叉堆实现了优先级队列,假如我们从构建好的优先级队列中持续调用删除最小(或者最大),把结果输出到另一个数组中,那么就可以把数组的所有元素进行排序,这就是本篇我们需要学习的堆排序。在看本篇之前需要先看下前一篇《原来实现优先级队列如此简单》

堆排序的过程主要有两个阶段:

  • 把原始数据构造成一个有序堆(构造堆)
  • 从堆中按照递减顺序取出所有元素就可以得到排序结果(下沉排序)

开始之前,我们需要把上一篇中的sink()方法修改一下;

保证我们在进行排序的时候直接使用原始的数组,无需建立一个辅助数组浪费空间;由于我们需要动态的缩小堆的大小,需要把size通过参数传入;

其次我们数组的下标是从0开始的,与之前的优先级排序有些差别,对于k节点的左边节点下标是2k+1,右边下标是2k+2

private void sink(Comparable[] queue, int k, int size) {
    while (2 * k + 1 < size) {
        int i = 2 * k + 1;
        if (i < size - 1 && less(queue[i], queue[i + 1])) {
            i++;
        }
        if (less(queue[i], queue[k])) {
            break;
        }
        exch(queue, i, k);
        k = i;
    }
}

构造堆

把一个输入的数组构建成一个堆有序,我们有两种方式:

  1. 从左向右遍历数组,然后把调用swim()上浮操作保证指针左边的元素都是堆有序的,就和优先级队列的插入过一样
  2. 由于数组中的每个位置已经是堆的节点,我们可以从右向左调用sink()下沉操作构造堆,这个过程我们可以跳过子堆为1的元素,所以我们只需要扫描数组的一半元素。这种方式会更高效。

例如:输入数组 a[]={8,3,6,1,4,7,2}

image

下沉排序

下沉是堆排序的第二个阶段,我们把最大元素删除,然后放入到堆缩小后数组中空出来的位置,当操作完成所有的元素之后,整个数组将会是有序的

下沉排序演示过程(图未完全画完):

image

堆排序代码实现

@Override
public void sort(Comparable[] array) {
    int size = array.length;
    for (int k = size / 2; k >= 0; k--) {
        sink(array, k, size);
    }
    while (size > 0) {
        exch(array, 0, --size);
        sink(array, 0, size);
    }
}

文中所有源码已放入到了github仓库https://github.com/silently9527/JavaCore

最后(点关注,不迷路)

文中或许会存在或多或少的不足、错误之处,有建议或者意见也非常欢迎大家在评论交流。

最后,写作不易,请不要白嫖我哟,希望朋友们可以点赞评论关注三连,因为这些就是我分享的全部动力来源🙏

相关文章

  • 堆排序

    转载:图解排序算法(三)之堆排序 预备知识 堆排序 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选...

  • 数据结构

    Q:堆排序 A:1 堆排序算法(图解详细流程)2 堆排序 Q:排序算法时间复杂度与稳定性 选择排序为什么不稳定:举...

  • [图解] 堆排序

    1. 图示过程 大根堆的性质: 堆顶的数一定是所有元素的最大值 任何一颗子树的根元素一定是该子树的最大元素 某节点...

  • 图解堆排序

    程序员常用的IDEA插件:https://github.com/silently9527/ToolsetIdeaP...

  • java堆排序

    什么是堆排序:图解堆排序堆排序:利用了堆这种数据结构堆数据结构:特殊的完全二叉树,因为具有以下的特点:1)每个结点...

  • 3.11 堆的概念及堆排序思路

    Chapter3: 更好的查找与排序算法 11. 堆的概念及堆排序 [1] 图解排序算法(三)之堆排序 讲得很好,...

  • 堆排序

    参考文章:图解排序算法(三)之堆排序 说在前面:本来对堆这种数据结构不了解,然后直接看的堆排序的介绍,看完之后一脸...

  • 各类排序算法总结

    因为网上资料太多,没必要重复造轮子,故收集不错的博客如下,很多时候一图胜千言: 堆排序图解链接、归并排序图解链接

  • 排序算法(1):堆排序

    图解堆排序 摘要: 堆排序是一种树形选择排序,在排序过程中可以把元素看成是一颗完全二叉树,每个节点都大(小)于它的...

  • 图解堆排序,拾遗

    这篇文章我们一起来复习一下堆排序,同时做一道经典的堆排序算法题:合并k个有序链表[https://leetcode...

网友评论

      本文标题:图解堆排序

      本文链接:https://www.haomeiwen.com/subject/dumqcltx.html