数据结构-外部排序
【数据结构】常见排序算法复杂度

【数据结构】常见排序算法复杂度相关概念1、稳定排序(stable sort)和⾮稳定排序稳定排序是指所有相等的数经过某种排序算法操作后仍然能保持它们在排序之前的相对次序。
反之就是⾮稳定排序。
2、内排序(internal sorting)和外排序(external sorting)在排序过程中,所有需要排序的数都在内存,并在内存中调整它们的存储顺序,称为内排序;在排序过程中,只有部分数被调⼊内存,并借助内存调整数在外存中的存放顺序排序⽅法称为外排序。
排序算法【冒泡排序】(Bubble Sort)冒泡排序⽅法是最简单的排序⽅法。
这种⽅法的基本思想是,将待排序的元素看作是竖着排列的“⽓泡”,较⼩的元素⽐较轻,从⽽要往上浮。
在冒泡排序算法中我们要对这个“⽓泡”序列处理若⼲遍。
所谓⼀遍处理,就是⾃底向上检查⼀遍这个序列,并时刻注意两个相邻的元素的顺序是否正确。
如果发现两个相邻元素的顺序不对,即“轻”的元素在下⾯,就交换它们的位置。
显然,处理⼀遍之后,“最轻”的元素就浮到了最⾼位置;处理⼆遍之后,“次轻”的元素就浮到了次⾼位置。
在作第⼆遍处理时,由于最⾼位置上的元素已是“最轻”元素,所以不必检查。
⼀般地,第i遍处理时,不必检查第i⾼位置以上的元素,因为经过前⾯i-1遍的处理,它们已正确地排好序。
冒泡排序是稳定的。
算法时间复杂度是O(n2)。
【选择排序】(Selection Sort)选择排序的基本思想是对待排序的记录序列进⾏n-1遍的处理,第 i 遍处理是将[i..n]中最⼩者与位置 i 交换位置。
这样,经过 i 遍处理之后,前 i 个记录的位置已经是正确的了。
选择排序是不稳定的。
算法复杂度是O(n2 )。
【插⼊排序】(Insertion Sort)插⼊排序的基本思想是,经过i-1遍处理后,L[1..i-1]⼰排好序。
第i遍处理仅将L插⼊L[1..i-1]的适当位置,使得L[1..i]⼜是排好序的序列。
要达到这个⽬的,我们可以⽤顺序⽐较的⽅法。
数据结构第八章_排序

49 38 65 97 76
三趟排序:4 13 27 38 48 49 55 65 76 97
算法描述
#define T 3 int d[]={5,3,1};
例 13 48 97 55 76 4 13 49 27 38 65 49 27 38 65 48 97 55 76 4 j j j
j
j
i
例 初始: 49 38 65 97 76 13 27 48 55 4 取d1=5 49 38 65 97 76 13 27 48 55 4 一趟分组:
一趟排序:13 27 48 55 4 取d2=3 13 27 48 55 4 二趟分组:
49 38 65 97 76 49 38 65 97 76
二趟排序:13 4 48 38 27 49 55 65 97 76 取d3=1 13 27 48 55 4 三趟分组:
初始时令i=s,j=t
首先从j所指位置向前搜索第一个关键字小于x的记录,并和rp
交换 再从i所指位置起向后搜索,找到第一个关键字大于x的记录, 和rp交换 重复上述两步,直至i==j为止 再分别对两个子序列进行快速排序,直到每个子序列只含有 一个记录为止
快速排序演示
算法描述
算法评价
例
38 49 49 38 65 76 97 13 97 76 97 27 13 30 97 27 97 30 初 始 关 键 字
38 49 65 13 76 27 76 13 30 76 27 76 30 97 第 一 趟
38 49 13 65 27 65 13 30 65 27 65 30
38 13 49
时间复杂度
最好情况(每次总是选到中间值作枢轴)T(n)=O(nlog2n) 最坏情况(每次总是选到最小或最大元素作枢轴)
数据结构名词解释

数据结构:是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作等的学科.数据: 所有能输入到计算机中并被计算机程序处理的符号的总称.数据元素: 在计算机上程序中通常作为一个整体进行考虑和处理.数据对象: 是性质相同的数据元素的集合,是数据的一个子集.数据类型: 一个值的集合和定义在这个值集上的一组操作的总称.线性表: 最常用却最简单的一种数据结构.栈:限定仅在表尾进行插入或删除操作的线性表. 栈顶:线性表尾端(表尾端)栈底:线性表头端(表头端)空栈:不含元素的空表. 队列:一种先进先出的线性表.队尾:在队列中,允许插入的一端.队头:在队列中.允许删除的一端.根的结点:在任意一棵非空树中,有且仅有一个特定的.结点的度:结点拥有的子树数.叶子: 度为0的结点.树的度: 树内各结点的度的最大值.非终端结点:度不为零的结点.孩子:结点的子树的根.双亲:该结点称为孩子的双亲.兄弟:同一个双亲的孩子之间.堂兄弟:双亲在同一层的结点.祖先:从根到该结点所经分支上的所有结点.孙子:以某结点为根的子树中的任一结点都称为该结点的孙子.树的深度:树中结点的最大层次.结点的层次:从根开始定义起,根为第一层,根的孩子为第二层.有序树:如果将树中结点的各子树看成从左到右是有次序的,就.....(即不能互换).无序树:(见有序树),否则称为无序树.森林:是m棵互不相交的树的集合.二叉树:是结点的有限集合,它可以为空,也可以是由一根结点和称为根的左右子树的两棵子树组成.满二叉树:一棵深度为k具有2k-1(应该是2的k次方再减1)结点的二叉树.完全二叉树:深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时.图:是一种较线性表和树更为复杂的数据结构.有向图/无向图:设VR是两个顶点之间的关系的集合,若<v,w>∈VR,则<v,w>表示从v到w的一条弧,此时的图称为有向图,/若<v,w>∈VR必有<w,v>∈VR,即VR是对称的,表示v和w之间的一条边,此时的图称为无向图.子图:假设有两个图G=(V,{E})和G'=(V',{E'}),如果V'包含于V且E'包含于E,则称G'为G的子图.完全图:有n(n-1)/2条边的无向图.邻接结点:孤立点:孤点的度:入度:对于有向图,以某顶点为弧头的弧的数目为该顶点的入度出度:以某顶点为弧尾的弧的数目为该顶点的出度路径:从树中一个结点到另一个结点之间的分支就构成这两个结点之间的路径路径长度:路径上经过的边或弧的数目叫路径长度回路:若一条路径上开始点和终止点相同则称此路径为回路。
第11章 外部排序

多路平衡归并的实现
二、胜者树及其使用 4路平衡归并
1 5
2 5
1234567 5 5 9 5 7 29 9
3 9
4
5
6
7
5
7
29
91
71
59
区
输
5
出
7
缓
冲
区
多路平衡归并的实现
二、胜者树及其使用 4路平衡归并
1
9
123
9 12 9
2
3
12
9
4567 16 12 29 9
4
5
6
7
16
12
29
9
输
5
7
29
9
入
16
12
38
22
缓
49
25
57
47
52
84
66
48
冲
78
91
71
59
区
输
5
出
7
缓
9
冲
区
多路平衡归并的实现
•采用胜者树,从 K 个元素中挑选一个最小的元素仅需 log2m × ( n - 1 ) × tmg 即内部归并时间与k无关, K 增大,归并趟数logkm减少 ,读写外存次数减少,外排总时间减少。
b[0]
b[1] b[2]
b[3]
5
7
29
9
输
5
7
29
9
入
第11章外部排序

外部排序
将两个有序段归并成一个有序段的过程, 将两个有序段归并成一个有序段的过程,若 在内存进行,则很简单,上一章中的merge 在内存进行 , 则很简单 , 上一章中的 过程便可实现此归并。 过程便可实现此归并。 由于我们不可能将两个有序段及归并结果段 同时存放在内存中, 同时存放在内存中,在外部排序中实现两两 归并时,不仅要调用merge过程, 而且要进 过程, 归并时 , 不仅要调用 过程 行外存的读/写 行外存的读 写。
11.2 外部排序的方法
外部排序指的是大文件的排序, 外部排序指的是大文件的排序,即待排序的 记录存储在外存储器上, 记录存储在外存储器上,待排序的文件无法 一次装入内存, 一次装入内存,需要在内存和外部存储器之 间进行多次数据交换, 间进行多次数据交换,以达到排序整个文件 的目的。 的目的。 外部排序最常用的是多路归并排序, 外部排序最常用的是多路归并排序,即将原 文件分解成多个能够一次性装人内存的部分, 文件分解成多个能够一次性装人内存的部分, 分别把每一部分调入内存完成排序。然后, 分别把每一部分调入内存完成排序。然后, 对已经排序的子文件进行归并排序。 对已经排序的子文件进行归并排序。
按字符组(记录 存放 按字符组 记录)存放。 记录 存放。 磁带上相邻两组字符组之间要留一空白区, 磁带上相邻两组字符组之间要留一空白区, 叫做间隙IRG(Inter Record Gap)。通常为 叫做间隙 。 1/4~3/4英寸。 英寸。 英寸 组成块可减少IRG数目,可减少 操作。 数目, 操作。 组成块可减少 数目 可减少I/O操作
分析d和 归并过程”的关系: 分析 和“归并过程”的关系: 若对10个初始归并段进行 路平衡归并, 个初始归并段进行5-路平衡归并 若对 个初始归并段进行 路平衡归并,即 每一趟将5个或 个或5个以下的有序子文件归并成 每一趟将 个或 个以下的有序子文件归并成 一个有序子文件,仅需进行二趟归并, 一个有序子文件,仅需进行二趟归并,外排 时总的读/写次数便减至 写次数便减至2*100+100=300, 时总的读 写次数便减至 路归并减少了200次的读 写。 次的读/写 比2-路归并减少了 路归并减少了 次的读
数据结构第7章排序

7.2.1 冒泡排序
• 排序过程 – 将第一个和第二个元素的关键字进行比较,若为逆序 ,则将两个元素互换;接着比较第二个和第三个元素 的关键字,依次类推,直至最后两个元素的完成比较 ,这称为第一趟冒泡排序。第一趟排序分划出一组元 素个数为n-1的待排序列和一个关键字最大的元素。 – 第i趟对前n - i + 1个的元素进行类似的排序操作,得到 一组元素个数为n - i的待排序列和一个(在前n-i+1个元 素中)关键字最大的元素。 – 这样不断分划直至一趟分划时无元素互换为止。
34 28 81 79 63 28 34 81 79 63 28 34 79 81 63
第一趟
28 34 79 63 81
第二趟
28 34 63 79 81
初始
7.2.1 冒泡排序
• 冒泡排序算法
template<class ElemType> void BubbleSort(ElemType data[], int n) { int lastSwapIndex = n - 1; //用于记录最后一次交换的元素下标 int i, j; for (i = lastSwapIndex; i > 0;i = lastSwapIndex){ lastSwapIndex = 0; for (j = 0; j < i; j++) if (data[j] > data[j + 1]){ Swap(data[j],data[j + 1]); lastSwapIndex = j; } } }
数 据 结 构
第7章 排序
概述
• 什么是排序? – 排序是计算机内经常进行的一种操作,其目的是将一 组“无序”的元素序列调整为“有序”的元素序列。 – 假设含n个记录的序列为{ R1, R2, …, Rn },其相应的 关键字序列为 { K1, K2, …,Kn }。这些关键字相互之 间可以进行比较,即在它们之间存在着这样一个关系 : Kp1≤Kp2≤…≤Kpn (或≥) 按此关系将上面记录序列重新排列为: { Rp1, Rp2, …,Rpn } 的操作称作排序。
严蔚敏《数据结构》(第2版)章节题库-第11章 外部排序【圣才出品】

第11章 外部排序一、选择题1.下列排序算法中,其中()是稳定的。
A.堆排序,起泡排序B.快速排序,堆排序C.直接选择排序,归并排序D.归并排序,起泡排序【答案】D2.若需在O(nlog2n)的时间内完成对数组的排序,且要求排序是稳定的,则可选择的排序方法是()。
A.快速排序B.堆排序C.归并排序D.直接插入排序【答案】C【解析】稳定排序有:插入排序、起泡排序、归并排序、基数排序。
不稳定排序有:快速排序、堆排序、shell排序。
时间复杂度平均为O(nlog2n)的有:归并排序、堆排序、shell排序、快速排序。
3.在下面的排序方法中,辅助空间为O(n)的是()。
A.希尔排序B.堆排序C.选择排序D.归并排序【答案】D4.下列排序算法中,占用辅助空间最多的是()。
A.归并排序B.快速排序C.希尔排序D.堆排序【解析】归并排序的辅助空间为O(n),快速排序所占用的辅助空间为O(logn),堆排序所占用的辅助空间为O(1)。
5.将两个各有N个元素的有序表归并成一个有序表,其最少的比较次数是()。
A.N B.2N-1 C.2N D.N-1【答案】A【解析】归并排序基本思想:归并排序是多次将两个或两个以上的有序表合并成一个新的有序表。
最简单的归并是直接将两个有序的子表合并成一个有序的表。
归并排序最好情况下的复杂度为O(n)。
6.从未排序序列中依次取出一个元素与已排序序列中的元素依次进行比较,然后将其放在已排序序列的合适位置,该排序方法称为()排序法。
A.插入B.选择C.希尔D.二路归并【答案】A【解析】解此题需要熟知各种排序方法的基本思想。
插入排序的基本思想是:假设待排序的记录存放在数组R[0..n-1]中,排序过程的某一中间时刻,R被划分成两个子区间R[0..i-1]和R[i..n-1],其中:前一个子区间是已排好序的有序区,后一个子区间则是当前未排序的部分,不妨称其为无序区。
将当前无序区的第1个记录R[i]插入到有序区R[0..i-1]中适当的位置上。
数据结构第十、十一章:排序

14
9.2 交换排序
冒泡排序
排序过程
将第一个记录的关键字与第二个记录的关键字进行比较, 将第一个记录的关键字与第二个记录的关键字进行比较,若 为逆序r[1].key>r[2].key,则交换;然后比较第二个记录与 为逆序 ,则交换; 第三个记录;依次类推,直至第n-1个记录和第 个记录比较 个记录和第n个记录比较 第三个记录;依次类推,直至第 个记录和第 为止——第一趟冒泡排序,结果关键字最大的记录被安置在 第一趟冒泡排序, 为止 第一趟冒泡排序 最后一个记录上 对前n-1个记录进行第二趟冒泡排序,结果使关键字次大的 个记录进行第二趟冒泡排序, 对前 个记录进行第二趟冒泡排序 记录被安置在第n-1个记录位置 记录被安置在第 个记录位置 重复上述过程,直到“ 重复上述过程,直到“在一趟排序过程中没有进行过交换记 录的操作” 录的操作”为止
按待排序记录所在位置
内部排序: 内部排序:待排序记录存放在内存 外部排序: 外部排序:排序过程中需对外存进行访问的排序
稳定排序和不稳定排序 假设Ki=Kj(1≤i≤n,1≤j≤n,i≠j),且在排序前的序列中Ri领先 假设 ( , , ),且在排序前的序列中 领先 ),且在排序前的序列中 于Rj(即i<j)。若在排序后的排序中Ri仍领先于 ,即那些具 ( )。若在排序后的排序中 仍领先于Rj, )。若在排序后的排序中 仍领先于 有相同关键字的记录,经过排序后它们的相对次序仍然保持不变, 有相同关键字的记录,经过排序后它们的相对次序仍然保持不变, 则称这种排序方法是稳定的;反之,若Rj领先于 ,则称所用的 则称这种排序方法是稳定的;反之, 领先于Ri, 领先于 方法是不稳定的。 方法是不稳定的。 按排序依据原则
4
例
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1 外存信息的存取
• 磁盘信息的存取 磁盘是一种直接存取的存储设备(DASD)。 • 页块的读写时间:TI/O = tseek + tlatency + n twm
– tseek:寻道时间 – tlatency:等待时间 – twm:传输时间
11-6
2 外部排序的方法
• 外部排序基本上由两个相对独立的阶段组成:
11-13
3 多路平衡归并的实现
• 胜者树及其使用 胜者进入下一轮, 快地挑出亚军、第三名 …… 。
IS
11-10
2 外部排序的方法
• d和“归并过程”的关系: 若对上例进行5路平衡归并: R1 R2 R3 R4 R5 R1’ R6 R7 R8 R9 R10 R2’
有序文件 仅需两趟归并, 总的读/写次数便减少为: 2x100+100=300, 比2路归并减少了200次的读/写。对 同一文件, 进行外排序时所需读/写外存的次数和归并 的趟数s成正比。一般情况下, 对m个初始归并段进行k 路平衡归并时, 归并的趟数s=floor(logkm). 可见:若能增加k或减少m便能减少s, 因此减少d.
floor(logkm)(k-1)(n-1)tmg = floor(log2m/log2k)(k-1)(n-1)tmg
• 由于(k-1)/log2k 随 k 的增长而增长, 这将抵消由于增大 k而减少外存信息读写时间所得效益。
11-12
3 多路平衡归并的实现
• 在进行k路归并时利用“败者树(Tree of Loser)”, 则可使在k个记录中选出关键字 最小的记录时仅需进行floor(log2k)次比较, 从而使总的归并时间变为: floor(log2m)(n-1)tmg 与k无关, 不再随k的增长而增长。
11-11
3 多路平衡归并的实现
• 对于2路归并, 令两个归并段上有u个记录, 每得到 归并后的一个记录, 仅需一次比较即可, 因此得到 含u个记录的归并段需进行u-1次比较。 • 对于k路归并, 令u个记录分布在k个归并段上, 显 然, 归并后的第一个记录应是k个归并段中关键字 最小的记录, 这需要进行k-1次比较, 得到u个记录 的归并段, 共需(u-1)(k-1)次比较。由此, 对n个记录的 文件进行外排序时, 在内部归并过程中进行的总的 比较次数为s(k-1)(n-1)。假设所得初始归并段为m个, 则 归并过程中进行比较的总的时间为:
11-7
2 外部排序的方法
• 例:一文件含10000记录, 通过10次内部排序得到10个初 始归并段R1…R10, 其中每一段都含有1000个记录。 然后作两两归并:
R1 R2 R3 R4 R5 R6 R7 R8 R9 R10
R1’
R2’
R3’
R4’
R5’
R3’’ R2’’’
R1’’ R1’’’
R2’’ 有序文件
记录 1 记录 2 记录 3
11-4
1 外存信息的存取
• 在磁带上读写一块信息所需的时间由两部分组 成: TI/O = ta + n tw
– ta为延迟时间, 即读/写头到达传输信息所在物理 快起始位置所需时间; – tw为传输一个字符的时间。
显然, 延迟时间和信息在磁带上的位置、 当前读/写头所在的位置有关。 所以磁带便宜、可反复使用、是一种顺序 存取设备, 但查找费时、速度慢(尤其是查找 末端记录时)。
数据结构
外部排序
本章内容 1 外存信息的存取 2 外部排序的方法 3 多路平衡归并的实现 4 置换-选择排序
5 最佳归并树
1 外存信息的存取
• 常用的外存储器分类:
– 顺序存取的设备(如磁带); – 随机存取的设备(如磁盘)。
常用的外存储器是磁表面存储器, 信息记 录在一薄层磁性材料的表面上, 这层材料附着 于载体表面, 随着载体作高速旋转或直线运动, 在运动过程中用磁头进行读或写。 外存信息的存取特点, 决定了外部排序的 策略选择。
11-3
1 外存信息的存取
• 磁带信息的存取 磁带存储器的工作原理和磁带录音机一样, 不 同之处在于它存储的是数字信息而不是模拟信息。 磁带上的信息在横向分布、纵向分布以及首尾 标志等都一定的格式。
– 以1/2英寸九道的磁带为例, 每一横排就可表示一个 字符(8位+1个校验位)。 – 纵向按区进行存储, 区的长度不固定, 但有一个范围, 例如2到4096字节, 相邻区之间有一定长度的间隔 (IBG, Inter Block Gap), 作为磁带起停之用。
11-9
2 外部排序的方法
• 外部排序所需总的时间 = 内部排序(产生初始归并段)所需的时间(m × t ) + 外存信息读写的时间(d × tIO) +内部归并所需的时间(s × utmg) • 其中: tIS 是为得到一个初始归并段进行内部排序所需时间的均值; tIO 是进行一次外存读/写时间的均值; utmg 是对u个记录进行内部归并所需时间; m 为经过内部排序之后得到的初始归并段的个数; s 为归并的趟数; d 为总的读/写次数。 • 于是上例进行外排序所需总的时间为:10 tIS + 500 tIO + 4x10000 tmg 显然tIO较tmg要大的多, 因此提高外排序的效率应主要着眼于减 少外存信息读写的次数d。
– 首先, 按可用内存大小, 将外存上含n个记录的文 件分成若干长度为l的子文件或段(segment), 依次 读入内存并利用有效的内部排序方法对它们进行排 序, 并将排序后得到的有序子文件重新写入外存, 通常称这些有序子文件为归并段或顺串(run); – 然后, 对这些归并段进行逐躺归并, 使归并段(有 序的子文件)逐渐由小至大, 直到得到整个有序文 件为止。
• 由10个初始归并段到一个有序文件, 共进行了4趟归并, 每一趟都从m个归并段得到ceil(m/2)个归并段。这种归 并方法称为2-路平衡归并。
11-8
2 外部排序的方法
• 外存上信息的读/写是以“物理块”为单位 进行的, 假设每个物理块可以容纳200个记 录, 则每一趟归并需进行50次“读”和50 次“写”, 4趟归并加上内部排序时所需进 行的读/写使得在外排序中总共需进行500 次读/写。