- 博客(15)
- 资源 (39)
- 收藏
- 关注
原创 归并排序:二路归并
归并排序(Merge Sort)是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个有序的子序列,再把有序的子序列合并为整体有序序列。归并排序的具体做法:把原序列不断地递归等分,直至每等份只有一个元素,此时每等份都是有序的。相邻等份合并,不断合并,直至合并完全。二路归并归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。归并排序最常用的是二路归并,即把两个小的有序的序列和并成一个大的有序序列:合二为一
2014-06-26 17:40:33 9749
原创 队列的应用:双端队列
双端队列(Deque:double ended queue)就是一个两端都是结尾的队列。队列的每一端都可以插入数据项和移除数据项。相对于普通队列,双端队列的入队和出队操作在两端都可进行。这里我们使用最常用的顺序结构来存储双端队列,为了节省空间,把它首尾相连,构成循环队列。并且规定left指向左端的第一个元素,right指向右端的下一个位置。那么队空的判断则是left==right,队满是(left-1+MAX)%MAX==right或者(right-left+MAX)%MAX==MAX。
2014-06-17 18:03:23 6521
原创 链表的应用:单元多项式的加法、减法、乘法
使用链表来实现单元多项式的加法、减法、乘法。一个单元多项式的节点结构无非是这样的:系数域、指数域、链域。我们使用链表来模拟单元多项式的常见运算。其中,加法是其它运算的基础,减法:poly1-poly2=poly1+(-poly2),乘法:poly1*poly2,可用poly1乘以poly2的每一项,相加其乘积结果。
2014-06-17 10:42:11 7487 7
原创 交换排序:快速排序
快速排序(Quick Sort)也是一种交换排序,它在排序中采取了分治策略。快速排序的主要思想是:从待排序列中选取一元素作为轴值(也叫主元)。将序列中的剩余元素以该轴值为基准,分为左右两部分。左部分元素不大于轴值,右部分元素不小于轴值。轴值最终位于两部分的分割处。对左右两部分重复进行这样的分割,直至无可分割。
2014-06-14 13:47:47 4619
原创 交换排序:冒泡排序
交换排序:两两比较待排序记录的关键码,若是逆置,则交换,直到无逆置。其中最简单的交换排序是:冒泡排序。冒泡排序(Bubble Sort,也叫起泡排序):不断地比较相邻的记录,若是不满足排序要求,则交换。交换时,可从前向后,也可从后向前。看一个从前向后的排序过程:
2014-06-12 18:24:08 1934
原创 队列的应用:优先队列
优先级队列:如果我们给每个元素都分配一个数字来标记其优先级,不妨设较小的数字具有较高的优先级,这样我们就可以在一个集合中访问优先级最高的元素并对其进行查找和删除操作了。这样,我们就引入了优先级队列 这种数据结构。 优先级队列(priority queue) 是0个或多个元素的集合,每个元素都有一个优先权,对优先级队列执行的操作有(1)查找(2)插入一个新元素 (3)删除 一般情况下,查找操
2014-06-12 11:26:17 3539
原创 选择排序:堆排序
堆排序(Heap Sort):使用堆这种数据结构来实现排序。先看下堆的定义:最小堆(Min-Heap)是关键码序列{k0,k1,…,kn-1},它具有如下特性:ki<=k2i+1,ki<=k2i+2(i=0,1,…)简单讲:孩子的关键码值大于双亲的。同理可得,最大堆(Max-Heap)的定义:ki>=k2i+1,ki>=k2i+2(i=0,1,…)简单讲:孩子的关键码值大于双亲的。同理可得,最大堆(Max-Heap)的定义:ki>=k2i+1,ki>=k2i+2(i=0,1,…)同样的:对于最大堆,双亲的关
2014-06-11 20:56:42 2642
原创 选择排序:简单选择、树形选择
选择排序(Selection Sort):经过一趟排序,可以从n-i+1(i=1,2...)个记录中选取关键字最小的记录作为有序序列中第i个记录。也就是说,每一趟排序,都会排好一个元素的最终位置。其中最简单的是简单选择排序(Simple Selection Sort)简单选择排序的思想是 在每一趟排序中,通过n-i次关键字的比较,从n-i+1个记录中选出关键字最小的记录,并和第i个记录
2014-06-10 17:21:33 7190 2
原创 队列的实现:链式队列
队列常常也使用链式存储的方式来实现。为了方便操作,同顺序存储一样,我们要维护一个头指针和一个尾指针。如下图:在链式队列中显然不会出现假溢出的情况。但在出队时,要及时释放内存。由于在队列的实现:顺序队列中,对队列的描述已经很清楚了。就闲话不多说,直接上代码:类定义和类实现#include#includeusing namespace std;typedef int ELem
2014-06-09 17:59:26 2666
原创 插入排序:希尔排序
我们知道当一个序列基本有序时,直接插入会变得很高效。因为此时只需少量的移动元素,操作集中在元素的比较上。基于这种想法,我们就试图把一个序列在进行直接插入前调整得尽量有序。这就是希尔排序(Shell Sort)的核心思路。(Shell只是算法发明者的名字,无特殊含义)那到底该怎么做呢? 希尔排序一反以前的做法,插入为何只在相邻的元素之间进行,不相邻的同样可以进行。于是,希尔排序也被形象
2014-06-07 21:15:28 1970 1
原创 队列的实现:顺序队列
队列(Queue)也是一种常见的线性表,它和栈相比有如下不同:队列可以在表的两端进行操作。栈只能在栈顶进行插入和删除。两端允许操作的类型不一样:可以进行删除的一端称为队头,这种操作也叫出队;可以进行插入的一端称为队尾,这种操作也叫入队。总的来说,队头只能出队,队尾只能入队。队列的示意图:模拟队列这种数据结构并不是什么难事,但会遇到一些问题,如:假溢出队
2014-06-07 16:26:59 6084
原创 栈的实现:链式栈
栈的链式存储,即链式栈。它相比于顺序栈,优点:插入、删除灵活 (不必移动节点,只要改变节点中的指针指向即可)。逻辑上相邻的节点物理上不必相邻。缺点:比顺序存储结构的存储密度小 (每个节点都由值域和链域组成,使用指针来表现前后节点的逻辑关系)。查找节点时链式存储要比顺序存储慢。这些优点、缺点体现了顺序存储和链式存储的相区别之处。看图就很形象了:
2014-06-05 21:22:15 4279 1
原创 插入排序:表折半插入
在前一篇插入排序:表插入中,我们用静态链表的存储方式,直接插入的策略,构建了一种新的插入排序算法:表插入。有人可能会想到:同样是静态链表的形式,为什么不使用更高效的折半插入的策略呢?这种想法真的很好,如果做到了,显然是极大的优化。 我在网上还真看到了相关的内容,大家可看下《表插入方法的改进》,里面有此想法的介绍。这篇博客就是介绍表插入的另一种实现:表折半插入。看完一定让你彻底理解它。
2014-06-05 17:26:57 2215
原创 插入排序:表插入
所谓插入排序之表排序,是利用静态链表的形式,分两步完成排序。一,对一个有序的循环链表,插入一新的元素,修改每个节点的后继指针的指向,使顺着这个指针的指向,元素是有序的。在这个过程中,我们不移动或交换元素,只是修改指针的指向。二,顺着指针的指向调整元素的位置,使其在链表中真正做到物理有序。思路:构建一新的结构体类型,使其封装了值域和指针域。并增加一节点,当做头节点,为循环终止
2014-06-02 20:44:44 3962 1
原创 插入排序:二路插入
在上一篇博客中:插入排序:直接插入、交换插入、折半插入。提到了三种插入排序的具体实现。不过仍有改进的地方。例如序列 2 1 3,当把1往前插入时,由于1<2,则应当把1插入到2的前面。在上述三种插入排序方法的实现中,都是把1、2位置交换。于是,我们想有没有可能不进行交换,因为交换总是相当耗时的。但是1必须要排到2的前面,可2的前面没有位置了啊?嗯,初看是这样的。试想这是一个循环的数组呢?这就是二路插入最核心的想法。
2014-06-01 15:47:26 6735 6
外排序-多路归并
2014-08-23
哈夫曼树&哈弗曼编码
2014-07-12
一元多项式的加法、减法、乘法
2014-06-17
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人