排序(1)——堆排序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaojie_570/article/details/87643336

排序有那么几种,从很早就开始接触,今天看了一下其他的算法题,有很多都用到了堆排序,想想之前自己的堆排序好像总有一点点含糊的地方,所以就赶紧看了看堆排序到底是怎么排序的咯~

堆是一个完全二叉树,什么是完全二叉树?来看百度:

一棵二叉树至多只有最下面的两层上的结点的度数可以小于2,并且最下层上的结点都集中在该层最左边的若干位置上,则此二叉树成为完全二叉树,并且最下层上的结点都集中在该层最左边的若干位置上,而在最后一层上,右边的若干结点缺失的二叉树,则此二叉树成为完全二叉树。文字看不懂?来贴图

在这里插入图片描述

堆的一些概念和性质就自行百度就好了,这里面主要是举个栗子:通过堆进行排序的栗子

堆排序栗子

现在给定了一个数组 arr = [16,7,3,20,17,8],对这个数组进行堆排序。

排序的过程分两步:

  • 初始化大顶堆(从下到上)
  • 堆顶元素与最后一个元素交换,然后再重新调整元素满足堆的性质(从上到下)

好了现在,我们就来看看具体是怎么做的吧~

  • 第一步:初始化大顶堆(从最后一个节点开始往上调整)

【注意】每次调整都是从父节点、左孩子节点、有孩子节点三者中选择最大者和父节点进行交换

在这里插入图片描述

现在我们已经完成了初始堆的创建,创建初始堆的时间复杂度为:O(n) n为元素的个数

建立完初始堆后,我们要来进行排序了。

  • 第二步:堆顶元素与最后一个元素交换。

在这个栗子中就是 20 和 3 交换,交换完成后,20作为最后一个元素即最大的元素,以后堆在更新的时候就不会涉及到 20 节点了。

在这里插入图片描述

在这里插入图片描述

这个图画的真的是有点恶心咯~

总结一下,初始建立大根堆是从下往上调整,排序更新堆是从上往下调整。但是不管是如何调整,每次调整都是从父节点、左孩子、右孩子三者中选择最大的跟父节点进行交换。

建立堆的时间复杂度:O(n)
更新堆的时间复杂度:O(logn)

猜你喜欢

转载自blog.csdn.net/xiaojie_570/article/details/87643336
今日推荐