在上一篇中,回顾了一下针对选择排序的优化算法——堆排序。堆排序的时间复杂度为O(n logn),而快速排序的时间复杂度也是O(n logn)。但是快速排序在同为O(n logn)的排序算法中,效率也是相对较高的,而且快速排序使用了算法中一个十分经典的思想——分治法;因此掌握快速排序还是很有必要的。 ...
分类:
编程语言 时间:
2019-04-06 14:00:47
阅读次数:
163
(from wikipedia) 构建步骤: 下面举例说明: 给定一个列表array=[16,7,3,20,17,8],对其进行堆排序。 首先根据该数组元素构建一个完全二叉树,得到 然后需要构造初始堆,则从最后一个非叶节点开始调整,调整过程如下: 第一步: 初始化大顶堆(从最后一个有子节点开始往上调 ...
分类:
其他好文 时间:
2019-03-29 23:35:59
阅读次数:
201
一、什么是优先队列? 普通队列:先进先出,后进后出 优先队列:出队顺序和入队顺序无关,和优先级相关。 优先队列的实现: 二、堆的基本实现 二叉堆的特点:这很重要!!! 是核心 任意节点小于其父节点 除了最后一层叶子节点外,其他层的元素个数必须是最大值 ,叶子节点虽然可以不是最大值,但必须靠左排列(最 ...
分类:
编程语言 时间:
2019-03-26 00:54:37
阅读次数:
170
1.关于数组和链表 数组:支持随机存取,取数据时时间复杂度O(1) 插入删除的时间复杂度O(N) 链表:不支持随机存取,取数据时时间复杂度O(N) 插入删除的时间复杂度为O(1) 2.排序的时间复杂度 冒泡排序、选择排序、插入排序,平均时间复杂度为O(N^2) 归并排序、快速排序、堆排序,平均时间复 ...
分类:
其他好文 时间:
2019-03-25 23:40:34
阅读次数:
288
堆排序的基本思想:将给定的数组转化成堆,然后将根节点与尾节点互换,将得到的树再次堆化,循环往复直到完成排序。 堆的性质:首先,堆是个完全二叉树,因此可以用一位数组表示;其次,对于堆中的每一个节点,它总是大于自己的孩子节点。 代码主要分为三个核心操作:1 对单个节点堆化;2 将整个数组堆化;3 将堆化 ...
分类:
编程语言 时间:
2019-03-25 16:20:58
阅读次数:
176
三、堆排序(Heapsort) 优先队列可以用于O(N log N) 存储空间增加一倍 排序类别 排序方法 时间复杂度 时间复 杂度 空间复杂度 稳定性 复杂性 平均情况 最坏情况 最好情况 选择排序 堆排序 O(nlog2n) O(nlog2n) O(nlog2n) O(1) 不稳定 较复杂 堆排 ...
分类:
编程语言 时间:
2019-03-25 10:31:01
阅读次数:
177
前言 上一篇写了 "数据结构之二叉搜索树、AVL自平衡树" ,这次来写堆。 堆的创造者 很久以前排序算法的时间复杂度一直是O(n^2), 当时学术界充斥着 “排序算法不可能突破O(n^2)” 的声音,直到1959年,由D.L.Shell提出了一种排序算法,希尔排序(Shell Sort),才打破了这 ...
分类:
编程语言 时间:
2019-03-25 09:14:17
阅读次数:
198
js十大排序算法详解十大经典算法导图 图片名词解释:n: 数据规模k:“桶”的个数In-place: 占用常数内存,不占用额外内存Out-place: 占用额外内存1.冒泡排序1.1 原始人冒泡排序function bubbleSort(arr) { var len = arr.length; fo... ...
分类:
编程语言 时间:
2019-03-22 22:43:30
阅读次数:
213
常用的内部排序方法有:交换排序(冒泡排序、快速排序)、选择排序(简单选择排序、堆排序)、插入排序(直接插入排序、希尔排序)、归并排序、基数排序(一关键字、多关键字)。 一、冒泡排序: 1.基本思想: 两两比较待排序数据元素的大小,发现两个数据元素的次序相反时即进行交换,直到没有反序的数据元素为止。 ...
分类:
编程语言 时间:
2019-03-20 13:01:40
阅读次数:
263