数据结构第十章 概述part5_第1页
数据结构第十章 概述part5_第2页
数据结构第十章 概述part5_第3页
数据结构第十章 概述part5_第4页
数据结构第十章 概述part5_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、10.5 归归 并并 排排 序序 归并排序的过程基于下列基本基本思想思想进行: 将两个或两个以上的有序子序列 “归并” 为一个有序序列。在内部排序中,通常采用的是2-路归并排序。即:将两个位置相邻位置相邻的记录有序子序列归并为一个一个记录的有序序列。有有 序序 序序 列列 Rl.n有序子序列有序子序列 Rl.m有序子序列有序子序列 Rm+1.n这个操作对顺序表而言,是轻而易举的。void Merge (RcdType SR, RcdType &TR, int i, int m, int n) / 将有序的记录序列将有序的记录序列 SRi.m 和和 SRm+1.n / 归并为有序的记录序

2、列归并为有序的记录序列 TRi.n / Mergefor (j=m+1, k=i; i=m & j=n; +k) / 将将SR中记录由小到大地并入中记录由小到大地并入TR if (SRi.key=SRj.key) TRk = SRi+; else TRk = SRj+; if (i=m) TRk.n = SRi.m; / 将剩余的将剩余的 SRi.m 复制到复制到 TRif (j=n) TRk.n = SRj.n; / 将剩余的将剩余的 SRj.n 复制到复制到 TR归并排序的算法归并排序的算法 如果记录无序序列 Rs.t 的两部分 Rs. (s+t)/2 和 R (s+t)/2 +1

3、.t分别按关键字有序,则利用上述归并算法很容易将它们归并成整个记录序列是一个有序序列。 由此,应该先分别对这两部分进行 2-路归并排序。2-2-路归并排序的过程路归并排序的过程初始状态初始状态 25 57 4837 1292 86第趟归并第趟归并 25 57 37 48 12 92 86第趟归并第趟归并 25 374857 128692第趟归并第趟归并 12 253748578692待排记录序列为待排记录序列为(25,57,48,37,12,92,86)(25,57,48,37,12,92,86)路归并排序每一趟执行后的序列状态路归并排序每一趟执行后的序列状态: :void Msort ( R

4、cdType SR, RcdType &TR1, int s, int t ) / 将将SRs.t 归并排序为归并排序为 TR1s.t if (s= =t) TR1s=SRs; else / Msort m = (s+t)/2; / 将将SRs.t平分为平分为SRs.m和和SRm+1.tMsort (SR, TR2, s, m); / 递归地将递归地将SRs.m归并为有序的归并为有序的TR2s.mMsort (SR, TR2, m+1, t); /递归地递归地SRm+1.t归并为有序的归并为有序的TR2m+1.tMerge (TR2, TR1, s, m, t); / 将将TR2s.m

5、和和TR2m+1.t归并到归并到TR1s.tvoid MergeSort (SqList &L) / 对顺序表对顺序表 L 作作2-路归并排序路归并排序 MSort(L.r, L.r, 1, L.length); / MergeSort 容易看出,对 n 个记录进行归并排序的时间复杂度为(nlogn)。即: 每一趟归并的时间复杂度为 O(n), 总共需进行 log2n 趟。 基数排序基数排序是一种借助“多关键字排序”的思想来实现“单关键字排序”的内部排序算法。多关键字的排序多关键字的排序链式基数排序链式基数排序10.6 基基 数数 排排 序序一、多关键字的排序一、多关键字的排序 n 个

6、记录的序列个记录的序列 R1, R2, ,Rn对关键字对关键字 (Ki0, Ki1, ,Kid-1) ) 有序有序是指: 其中其中: : K0 被称为被称为 “最主最主”位关键字位关键字Kd-1 被称为被称为 “最次最次”位关键字位关键字 对于序列中任意两个记录 Ri 和 Rj(1ijn) 都满足满足下列(词典词典)有序有序关系: (Ki0, Ki1, , ,Kid-1) ) (Kj0, Kj1, , ,Kjd-1) ) 实现多关键字排序通常有两种作法实现多关键字排序通常有两种作法: :最低位优先最低位优先LSD法法最高位优先最高位优先MSD法 先对先对K0进行排序进行排序,并按 K0 的不同

7、值将记录序列分成若干子序列之后,分别对 K1 进行排序,., 依次类推,直至最后直至最后对最次位关键字排序完成为止对最次位关键字排序完成为止。最高位优先最高位优先MSD法 先对 Kd-1 进行排序,然后对 Kd-2 进行排序,依次类推,直至对最主位直至对最主位关键字关键字 K0 排序完成为止排序完成为止。 排序过程中不需要根据 “前一个” 关键字的排序结果,将记录序列分割成若干个(“前一个”关键字不同的)子序列。最低位优先最低位优先LSD法法例如例如: :学生记录含三个关键字:系别系别、班号班号和班内的序列号班内的序列号,其中以系别为最主位关键字。 无序序列无序序列对对K2排序排序对对K1排序

8、排序对对K0排序排序3,2,301,2,153,1,202,3,182,1,201,2,152,3,183,1,202,1,203,2,303,1,202,1,201,2,153,2,302,3,18 1,2,152,1,202,3,183,1,203,2,30LSD的排序过程如下:二、链式基数排序二、链式基数排序假如多关键字的记录序列中,每个关键字假如多关键字的记录序列中,每个关键字的取值范围相同,则按的取值范围相同,则按LSD法进行排序时,可法进行排序时,可以采用以采用“分配分配- -收集收集”的方法,其好处是不需要的方法,其好处是不需要进行关键字间的比较。进行关键字间的比较。对于数字型或

9、字符型的对于数字型或字符型的单关键字单关键字,可以,可以看看成成是由多个数位或多个字符构成的是由多个数位或多个字符构成的多关键字多关键字,此时可以此时可以采用采用这种这种“分配分配- -收集收集”的办法的办法进行排进行排序序,称作基数排序法称作基数排序法。例如:例如:对下列这组关键字 209, 386, 768, 185, 247, 606, 230, 834, 539 首先按其 “个位数” 取值分别为 0, 1, , 9 “分配分配” 成 10 组,之后按从 0 至 9 的顺序将 它们 “收集收集” 在一起; 然后按其 “十位数” 取值分别为 0, 1, , 9 “分配分配” 成 10 组,

10、之后再按从 0 至 9 的顺序将它们 “收集收集” ” 在一起; 最后按其“百位数”重复一遍上述操作。在计算机上实现基数排序时,为减少所需辅助存储空间,应采用链表作存储结构,即链式基数排序,具体作法为: 待排序记录以指针相链,构成一个链表;待排序记录以指针相链,构成一个链表; “分配分配” ” 时,按当前时,按当前“关键字位关键字位”所取值,所取值,将记录分配到不同的将记录分配到不同的 “ “链队列链队列” ” 中,每个队列中记中,每个队列中记录的录的 “ “关键字位关键字位” ” 相同;相同; “收集收集”时,按当前关键字位取值从小到大时,按当前关键字位取值从小到大将各队列首尾相链成一个链表

11、将各队列首尾相链成一个链表; ; 对每个关键字位均重复对每个关键字位均重复 2) 和和 3) 两步。两步。例如:p369367167239237138230139进行第一次分配进行第一次分配进行第一次收集进行第一次收集f0 r0f7 r7f8 r8f9 r9p230230367 167237367167237138369239139369 239139138进行第二次分配进行第二次分配p230237138239139p230367167237138369239139f3 r3f6 r6230 237138239139367 167369367167369进行第二次收集 进行第三次收集之后便得到

12、记录的有序序列进行第三次收集之后便得到记录的有序序列f1 r1p230237138239139367167369进行第三次分配进行第三次分配f2 r2f3 r3138 139167230 237239367 369p138139167230237239367369提醒注意:提醒注意:“分配分配”和和“收集收集”的实际操作仅为的实际操作仅为修改链表中的指针和设置队列的头、尾指修改链表中的指针和设置队列的头、尾指针;针;为查找使用,该链表尚需应用算法为查找使用,该链表尚需应用算法Arrange 将它调整为有序表。将它调整为有序表。 基数排序的时间复杂度为基数排序的时间复杂度为O(d(n+rd)其中

13、:分配为O(n) 收集为O(rd)(rd为“基”) d为“分配-收集”的趟数10.7 各种排序方法的综合比较各种排序方法的综合比较一、时间性能一、时间性能1. 平均的时间性能平均的时间性能基数排序基数排序时间复杂度为时间复杂度为 O(nlogn):快速排序、堆排序和归并排序快速排序、堆排序和归并排序时间复杂度为时间复杂度为 O(n2):直接插入排序、起泡排序和直接插入排序、起泡排序和简单选择排序简单选择排序时间复杂度为时间复杂度为 O(n): 2. 当待排记录序列按关键字顺序有序时当待排记录序列按关键字顺序有序时 3. 简单选择排序、堆排序和归并排序简单选择排序、堆排序和归并排序的时间性能不随

14、不随记录序列中关键字的分布而改变。直接插入排序直接插入排序和起泡排序起泡排序能达到O(n)的时间复杂度,快速排序快速排序的时间性能蜕化为O(n2) 。二、空间性能二、空间性能指的是排序过程中所需的辅助空间大小 1. 所有的简单排序方法简单排序方法(包括:直接插入、起泡和简单选择) 和堆排序堆排序的空间复杂度为为O(1); 2. 快速排序为快速排序为O(logn),为递归程序执行过程中,栈所需的辅助空间;3. 归并排序归并排序所需辅助空间最多,其空间复杂度为 O(n);4. 链式基数排序链式基数排序需附设队列首尾指针,则空间复杂度为 O(rd)。三、排序方法的稳定性能三、排序方法的稳定性能 1.

15、 稳定的排序方法指的是,对于两个关键字相等的记录,它们在序列中的相对位置,在排序之前和经过排序之后,没有改变。 2. 当对多关键字的记录序列进行LSD方法排序时,必须采用稳定的排序方法。排序之前 : Ri(K) Rj(K) 排序之后 : Ri(K) Rj(K) 例如:例如: 排序前 ( 56, 34, 47, 23, 66, 18, 82, 47 )若排序后得到结果 ( 18, 23, 34, 47, 47, 56, 66, 82 )则称该排序方法是稳定稳定的;若排序后得到结果 ( 18, 23, 34, 47, 47, 56, 66, 82 )则称该排序方法是不稳定不稳定的。 3. 对于不稳

16、定的排序方法,只要能举出一个实例说明即可。 4. 快速排序、堆排序和希尔排序是不稳定的排序方法。例如例如 : 对 4, 3, 4, 2 进行快速排序, 得到 2, 3, 4, 4 四、关于四、关于“排序方法的时间复杂度的下限排序方法的时间复杂度的下限” 本章讨论的各种排序方法,除基数排序外,其它方法都是基于基于“比较关键字比较关键字”进行排序的排进行排序的排序方法。序方法。 可以证明, 这类排序法可能达到的最快的可能达到的最快的时间复杂度为时间复杂度为O(nlogn)。 (基数排序不是基于“比较关键字”的排序方法,所以它不受这个限制。) 例如例如:对三个关键字进行排序的判定树如下:对三个关键字进行排序的判定树如下:K1K3K1K2K1K3K2K3K2 K3K2K1K3K1K2K3K3K2K1K2K3K1K3K1K2K1K3K2树上的树上的每一次每一次“比较比较”都是必要的都是必要的;树上的树上的叶子结点包含所有可能情况叶子结点包含所有可能情况。 一

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论