堆排序算法的图文详解

堆排序算法的图文详解


堆排序过程主要由三个步骤组成:

  • 构建大顶堆/小顶堆
  • 构建初始化堆
  • 排序

贯穿整个堆排序过程的一个重要算法就是对堆进行调整。下面我们按照上面三个步骤介绍详细的堆排序过程。(这里我们以大顶堆为例展开介绍)

创建初始化堆

给定一个数组Array=[4, 12, 3, 2, 16, 10, 14, 8, 7]
Step1:构建一个完全二叉树
根据数组创建一个完全二叉树

Step2:初始化大顶堆,从编号为5的节点开始进行调整(由于堆排序是自底向上的排序方式,从编号最大的内节点开始调整)。调整的思路:如果i号节点比它的两个子节点都大,那么就不进行调整;如i号节点比子节点小,那么选择最大的子节点与i号节点进行交换。
初始化大顶堆

  • 左上荧光标记部分得到16>7,因此保持原状态不变
  • 右上荧光标记部分通过比较[2, 4,8],可以得出14最大,那么将14与2交换,得到局部堆
  • 左下图中可以看出[3, 9, 10]中,10最大,将3与10进行交换
  • 直到交换到编号1为止,此时编号1位置的值最大
  • 如下图所示,是第一轮调整过后的模型,但此时还不是大顶堆
    继续调整该二叉树
    由于4与16发生了交换,导致该树的左子树的堆结构被破坏,因此需要进行重新调整。但是我们直到以4为根节点的两个子树在前面已经是堆结构了,那么我们在调整时,直接比较[4, 14, 12]之间哪个最大,选择最大的那个值与4交换,我们发现14最大,因此14与4做交换。实质上,这就是一个自顶向下的调整过程。直到最后的模型成为堆结构为止。最后的堆结构模型如下图所示:
    初始化大顶堆结构模型
    目前,我们已经完成了初始化堆模型的构建。接下来我们将进行堆排序操作。一会我们可以看到,对于堆的排序,实际上也是一个不断调整堆的过程。

堆排序

Step3:堆排序。基本思想:交换a[1]和a[length],将第一个元素与最后一个元素交换,因为根据我们Step2中的操作,我们已经得到了该数组中的最大值,我们将最大值扔到末尾,然后在对剩下的元素a[1……9]进行堆调整,然后我们就可以得到第二大的元素,再把第二大元素扔到剩下元素的末尾,不断进行该操作,我们最后就可以完成堆排序了。
下面我们将用图作为演示:

  • 第一次交换,交换a[1]和a[10](即交换16和7)
    第一次交换
    交换以后最大的元素到了编号为10的位置,将该节点从堆中摘除,后续排序中不用再考虑它了。可以发现,a[1……9]的堆结构又被破坏了,咱们按照前面的调整方案继续对该堆进行调整。蓝色笔迹部分就是调整后的堆结构。当结构再次编程堆结构时,咱们再重复上面的交换操作,这一次就交换a[1]和a[9],那么第二大的元素就到了编号为9的位置了,将该节点从堆中摘除。继续对破坏了的堆结构进行调整,直到所有的节点都从结构为堆的二叉树上被摘除为止。
  • 第二次交换,交换a[1]和a[9]:
    第二次交换
  • 第三次交换,交换a[1]和a[8]:
    第三次交换
    步骤都是一样的,就不全部展示了,下面放出最后的结果
  • 最后的结果图如下所示:
    最终排序结果

猜你喜欢

转载自blog.csdn.net/sunny_yeah_/article/details/84960359