堆数据结构实际上是一种数组对象,是以数组的形式存储的,可是它能够被视为一颗全然二叉树,因此又叫二叉堆。堆分为下面两种类型:大顶堆:父结点的值不小于其子结点的值,堆顶元素最大小顶堆:父结点的值不大于其子结点的值,堆顶元素最小堆排序的时间复杂度跟合并排序一样,都是O(nlgn),可是合并排序不是原地排序...
分类:
编程语言 时间:
2014-10-20 21:14:02
阅读次数:
239
终于到了经典的快排了,作为20世纪科学和工程领域十大算法之一,自60年代发明以来,一直吸引着一批批工程师和科学家对其改进,今天我们就分析快排算法以及它的几种改进方案。快速排序概述:快速排序算法也是基于分治思想的方案,与归并排序不同的是,它是原地排序,同时可以将长度为N的数组排序所需的时间和NlogN...
分类:
其他好文 时间:
2014-09-29 13:14:30
阅读次数:
181
一、排序的两种方式(1)原地排序(In-place sorting):按指定的顺序排列数据,然后用排序后的数据替换原来的数据,原来的数据丢失。sort(),列表的标准方法,e.g. mylist.sort()(2)复制排序(Copied sorting):按指定的顺序排列数据,然后返回原数据一个有序...
分类:
编程语言 时间:
2014-09-23 00:04:13
阅读次数:
310
参考资料:算法导论性能:给定n个d位数,每一个数位可以取k种可能的值,基数排序算法时间为O(d(n+k)),当d为常数,k=O(n)时,基数排序为O(n)时间优点:稳定排序缺点:不是原地排序实现代码(用户需要提供一个RSHelper的实现即可完成排序,本例给出一个随意的实现仅作示意)RadixSor...
分类:
其他好文 时间:
2014-09-12 23:22:44
阅读次数:
289
插入排序它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(原地排序,即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。算法描述一般来说...
分类:
编程语言 时间:
2014-09-04 16:56:29
阅读次数:
180
《算法之道》精华 经典算法部分
本书作者绉恒明,作者另有一本书《数据结构之弦》,以及《操作系统之哲学原理》都是很好的书这本书可以算得上是深入浅出,文笔很好,作者添加了很多自己的思考本文包括经典算法部分
第十章 排序与次序
插入排序
从无序部分抽取一张插入有序部分为原地排序,无需占用临时存储空间最优情况下为O(n),平均O(n^2)
折半插入排序
插入时使用二分查找
归...
分类:
其他好文 时间:
2014-08-09 11:36:47
阅读次数:
238
堆数据结构实际上是一种数组对象,是以数组的形式存储的,但是它可以被视为一颗完全二叉树,因此又叫二叉堆。堆分为以下两种类型:
大顶堆:父结点的值不小于其子结点的值,堆顶元素最大
小顶堆:父结点的值不大于其子结点的值,堆顶元素最小
堆排序的时间复杂度跟合并排序一样,都是O(nlgn),但是合并排序不是原地排序(原地排序:在排序过程中,只有常数个元素是保存在数组以外的空间),合并排序的多有元素都被...
分类:
其他好文 时间:
2014-08-05 22:34:10
阅读次数:
232
堆数据结构是一种数组对象,它可以被视为一颗完全二叉树,树中每个节点和数组中存放该节点值的那个元 素对应。如果表示堆的数组为A,那么树的根为A[1]。
一、 堆
1. 表示堆的数组A是一个具有两个属性的对象:length(A)是数组中的元素个数,heap-size(A)是存放在A中的堆的元素个数;A[heap-size(A)]之后的元素都不属于相应的堆。也就是:Heap-size(A)。
2....
分类:
其他好文 时间:
2014-07-08 20:23:53
阅读次数:
222
一、 快速排序的描述
1、 快速排序是一种原地排序的算法,最坏情况下的时间复杂度为Θ(n^2),期望的运行时间为Θ(n logn),且其中隐含的常数因子较小。
2、 快速排序分三个步骤:
分解:数组A[p...r]被划分成两个数组A[p...q-1]和A[q+1...r],使得A[p...q-1]中的元素都小于等于A[q],A[q+1...r]中的元素都大于等于A[q]。下标q在这个划分过程...
分类:
其他好文 时间:
2014-07-08 15:31:28
阅读次数:
203
堆排的灵感源自于堆的数据结构。它是一种原地排序算法,不需要额外的临时数组。
基本思想
堆排的基本思想是:
先建立一个最大堆
将最大的元素移动到数组末尾,减小堆的大小,调整最大堆使其符合最大堆的性质
重复第二步,直到最大堆耗尽为止
第一个步骤建立最大堆的代码非常简单,只要对每个节点执行sink操作即可。
...
分类:
其他好文 时间:
2014-06-10 06:55:08
阅读次数:
295