美文网首页程序员
最大堆进阶:堆排序及其优化

最大堆进阶:堆排序及其优化

作者: 航哥很帅 | 来源:发表于2018-10-20 09:49 被阅读88次

上一讲中我们把最大堆的基本存储和两个经典的操作进行了介绍,并且在文章的最后,我们依次执行了删除根节点的操作,这时候你看到了一个排好序的数列,本节课我就把堆排序给您讲清楚。

下面的图片是ShiftUp和ShiftDown的源码,一是你可以验证一下自己编写的是不是合理,再一个也是作为我们后面文字的辅助理解材料。

ShifUp和ShiftDown源码

基础堆排序

基础堆排序的源码如下:

基础堆排序源码

从源码中可以看出来,基础堆排序的过程非常简单:先定义一个最大堆,然后将待排序数组中的元素向最大堆中依次插入(构造最大堆的过程),最后再把最大堆中的元素一个一个取出来(每次操作都是取出根节点),从后向前依次放回待排序数组中。

下面是insertItem(插入操作)和extractItem(删除根节点操作)的源码:

insertItem和extractItem的源码

基础堆排序有两个问题:

一是:构建最大堆的过程比较繁琐,要对每一个插入最大堆的元素进行shiftUp操作;

二是:使用了额外的存储空间,构建的最大对对象就是额外的存储空间。

下面我们先解决第一个问题。

最大堆的heapify

heapify操作的定义如下:

我们可以把任何一个数列看成是一个带重组的最大堆,而这个数列中所有的叶子节点其实单独拿出来都是一个最大堆。那我们就从最后一个非叶子开始依次往前,对每一个非叶子节点做shiftDown操作,操作完成之后,这个数列也就变成了一个最大堆。

源码如下图所示:

heapify源码

结合heapify操作,我们可以重写堆排序的源码,源码如下:

结合heapify操作的堆排序

怎么样,看来上面两个排序的源码有什么感想呢?我在学习这部分算法时就有一种感觉:

过程只要想清楚,源码写出来那是即精悍,又短小。

优化的堆排序

下面我们解决基础堆排序中的第二个问题,即处理掉那额外的存储空间。算法过程如下:

对于一个待排序的数组,我们第一步要做的就是把这个数组通过heapify的过程先整理成最大堆。然后,在这个数组中,对最大堆进行整理,形成一个排好序的数列,如何整理呢?详细过程如下:

最大堆的排序过程

最大堆优化后排序的源码如下:

优化后的堆排序源码

怎么样,是不是还是那个感觉:即短小,又精悍。

好,到此为止我们已经把最基本的四种排序(插入排序、归并排序、快速排序、堆排序)都进行了介绍,下一篇文章我会把所有已经讲过的排序做一个总结,希望能够对你理解排序算法有帮助。

我是徐建航,这是我写的第63篇文章,欢迎你加入007社群,七天写一篇,一起写七年,七年之后一起去南极。

相关文章

  • 最大堆进阶:堆排序及其优化

    上一讲中我们把最大堆的基本存储和两个经典的操作进行了介绍,并且在文章的最后,我们依次执行了删除根节点的操作,这时候...

  • 对于基础排序算法的简要总结

    本文主要分析排序算法中的选择排序、插入排序、希尔排序、归并排序、快速排序和堆排序,以及其部分优化方式,部分代码示例...

  • 常见的排序算法-2.1 选择排序(堆排序)

    选择排序的优化方案(堆排序)

  • mysql进阶-索引及其优化

    一 关于索引 1. 索引概述 索引是存储引擎用于快速找到记录的一种数据结构 索引的优点:减少扫描的数据量,加速查询...

  • 堆排序(下):最大堆

    二叉堆,简称堆 Heap 尖的完全二叉树。也有三叉堆以及普通堆,但大部分时候堆就是指二叉堆 二叉堆的定义 一棵完全...

  • 堆排序

    什么是堆排序?就是通过不断取出最大堆的堆顶元素。取完之后剩下的数据排序满足最大堆之后再次取堆顶元素,重复以上操作最...

  • 堆排序

    利用Python实现堆排序 创建最大堆:将堆所有数据重新排序,使其成为最大堆 最大堆调整:作用是保持最大堆的性质,...

  • 03-堆排序(Heap Sort)

    堆排序(Heap Sort) 结合上一讲的内容,发现选择排序可以使用堆排序来进行优化。所以堆排序可以认为是对选择排...

  • 经典排序算法 - 堆排序Heap sort

    经典排序算法 - 堆排序Heap sort堆排序有点小复杂,分成三块第一块,什么是堆,什么是最大堆第二块,怎么将堆...

  • 堆排序

    堆排序算法利用堆的结构来执行快速排序。 为了实现从最低到最高排序,堆排序首先将未排序的数组转换为最大堆,以便数组中...

网友评论

    本文标题:最大堆进阶:堆排序及其优化

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