本博客总结学习堆排序算法,以一个数组为例,采用大根堆进行升序排序,附有代码实现。 堆排序的思想 堆排序的逻辑是建立在完全二叉树的基础上。 有两个概念必须要了解: 大根堆:每个结点值都大于等于左右孩子结点值 小根堆:每个结点值都小于等于左右孩子结点值 以大根堆为例,将根结点与最后一个结点交换,弹出根结 ...
分类:
编程语言 时间:
2020-06-30 13:03:10
阅读次数:
63
通过上一节的学习,我们了解到 二叉堆的本质还是一个完全二叉树 无序数组通过构造、通过下沉构造可以构造为最小堆 通过上浮构造可以构造为最大堆 来说今天的堆排序算法之前、首先请和我一起、再次了解一下二叉堆元素的删除 二叉堆删除元素 这里假设我们这里有这样的一个完全二叉树如下: 1、删除顶部1号元素【暂且 ...
分类:
编程语言 时间:
2020-06-03 13:39:39
阅读次数:
67
什么是堆 堆 首先是一个完全二叉树, 堆 分为 大顶堆 和 小顶堆 ; 大顶堆 : 每个节点的值大于或等于其左右孩子节点的值,称为大顶堆。 小顶堆 同理就是每个节点的值小于或等于其左右孩子节点的值。 注意 : 每个节点的左右孩子节点的大小关系并没有限定。 大顶堆举例 如图: 首先其为一个完全二叉树, ...
分类:
编程语言 时间:
2020-05-19 18:10:55
阅读次数:
74
在经典堆排序算法中直接用fixDown操作。for循环构造堆,然后while循环把最大元素和最末尾的元素互换并且修复堆,直到堆为空为止。 堆排序比快速排序慢,但比归并排序快,而且不需要额外的储存空间,且运行时间对输入并不是特别敏感。 1 template <class Item> 2 void he ...
分类:
编程语言 时间:
2020-04-22 23:00:39
阅读次数:
110
目录 1. 各种算法的比较 2. 算法不稳定定义 3. 不稳定的几种算法 1. 各种算法的比较 2. 算法不稳定定义 定义:在排序之前,有两个数相等,但是在排序结束之后,它们两个有可能改变顺序. 说明:在一个待排序队列中,A和B相等,且A排在B的前面,而排序之后,A排在了B的后面.这个时候,我们说这 ...
分类:
其他好文 时间:
2020-04-14 12:27:44
阅读次数:
68
#堆排序#基本思想:1.将初始待排序数字列表(R1,R2,...,Rn)构建成大顶堆,此堆为初始的无序列表# 2.将堆顶元素R1与最后一个元素Rn交换,此时得到新的无序列表(R1,R2,...,Rn-1)和新的有序列表(Rn)# 3.由于交换后新的堆顶R1可能违反堆的性质,因此需要对当前无序列表(R ...
分类:
编程语言 时间:
2020-02-12 21:57:43
阅读次数:
72
堆排序算法就是通过维护一个小根堆或者大根堆的数据结构。小/大根堆本质上是一个完全二叉树。利用了完全二叉树的性质,即完全二叉树节点x的子节点编号为2x和2x+1。 利用这个性质,我们可以让一个一维数组来模拟这个二叉树,数组下标从1开始建立,下标为2*x和2*x+1的就是x的左子树和右子树。 #incl ...
分类:
编程语言 时间:
2020-02-08 17:57:21
阅读次数:
130
堆排序算法。堆堆又被称为优先队列。按照元素的优先级取出元素。普通队列:先进先出;后进后出优先队列:出队顺序和入队顺序无关;和优先级相关在优先队列的内部,元素的次序却是由”优先级”来决定的:高优先级的元素排在队首,而低优先级的元素排在后面。优先队列入队操作比较复杂,需要将元素根据优先级尽量排到队列前面... ...
分类:
编程语言 时间:
2020-01-29 12:12:14
阅读次数:
94
目录 堆的概念要点算法分析 堆排序算法的总体情况 时间复杂度 算法稳定性完整参考代码 JAVA版本参考资料相关阅读 说明 堆的概念 在介绍堆排序之前,首先需要说明一下,堆是个什么玩意儿。 堆是一棵顺序存储的完全二叉树。 其中每个结点的关键字都不大于其孩子结点的关键字,这样的堆称为小根堆。 其中每个结 ...
分类:
编程语言 时间:
2020-01-16 10:30:47
阅读次数:
70
1. 堆排序 算法核心思想 堆排序利用堆的特点, 最大堆要求节点的元素都要不小于其孩子,最小堆要求节点元素都不大于其左右孩子,那么处于最大堆的根节点的元素一定是这个堆中的最大值,每次把堆顶元素放置在二叉树的尾部,然后重新建堆这样循环处理,最终就能完成排序。 核心算法逻辑如下: 建堆 把堆顶的元素和最 ...
分类:
编程语言 时间:
2019-12-09 21:22:00
阅读次数:
86