版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第十章 内部排序,10.1 概述 10.2 插入排序 10.2.1 直接插入排序 10.2.2 折半插入排序 10.2.3 shell排序 10.3 交换排序(快速排序) 10.4 选择排序 10.4.1 简单选择排序 10.4.3 堆排序 10.5 归并排序 10.6 基数排序 10.7 各种排序方法的比较讨论,学习要点,理解排序的定义和各种排序方法的特点; 了解各种方法的排序过程及其依据的原则; 理解“稳定”或“不稳定”的含义;,排序定义将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列叫 排序分类 按待排序记录所在位置 内部排序:待排序记录存放在内存 外部排序:排序过程
2、中需对外存进行访问的排序 按排序依据原则 插入排序:直接插入排序、折半插入排序、希尔排序 交换排序:冒泡排序、快速排序 选择排序:简单选择排序、堆排序 归并排序:2-路归并排序 基数排序,10.1 概述,按排序所需工作量 简单的排序方法:T(n)=O(n) 先进的排序方法:T(n)=O(logn) 基数排序:T(n)=O(d.n) 排序基本操作 比较两个关键字大小 将记录从一个位置移动到另一个位置 稳定排序与不稳定排序 关键码相同的数据对象在排序过程中是否保持前后次序不变。如 2, 2*,1,排序后若为1, 2*, 2 则该排序方法是不稳定的。,10.2 插入排序 直接插入排序:整个排序过程为
3、n-1趟插入,即先将序列中第1个记录看成是一个有序子序列,然后从第2个记录开始,逐个进行插入,直至整个序列有序 例:序列为49,38,65,97,76,13,27,49 (49),38,65,97,76,13,27,49 (38) (38,49),65,97,76,13,27,49 (65) (38,49,65),97,76,13,27,49 (97) (38,49,65,97),76,13,27,49 (76) (38,49,65,76,97),13,27,49 (13) (13,38,49,65,76,97),27,49 (27) (13,27,38,49,65,76,97),49 (49
4、) (13,27,38,49,49,65,76,97),直接插入排序的算法,Void InsertSort (SqList /将L. ri 插入正确位置 InsertSort,算法评价 时间复杂度 若待排序记录按关键字从小到大排列(正序) 关键字比较次数:,记录移动次数:,若待排序记录按关键字从大到小排列(逆序) 关键字比较次数:,记录移动次数:,若待排序记录是随机的,取平均值 关键字比较次数:,记录移动次数:,T(n)=O(n),空间复杂度:S(n)=O(1),直接插入排序的稳定性,直接插入排序是一种稳定的排序方法。 原理:关键码相同的两个对象,在整个排序过程中,不会通过比较而相互交换。,折
5、半插入排序 排序过程:用折半查找方法确定插入位置的排序叫,例,i=1 (30) 13 70 85 39 42 6 20,i=2 13 (13 30) 70 85 39 42 6 20,i=7 6 (6 13 30 39 42 70 85 ) 20,.,i=8 20 (6 13 20 30 39 42 70 85 ),Void BInsertSort (SqList (插入记录) /for ,时间复杂度:T(n)=O(n) 空间复杂度:S(n)=O(1),折半插入排序的稳定性,折半插入排序是一种稳定的排序方法。 原理:关键码相同的两个对象,在整个排序过程中,不会通过比较而相互交换。,希尔排序(缩
6、小增量法) 它属于插入排序类的方法。它的基本思想是:先将整个待排序的记录分割成若干子序列分别进行直接插入排序,待整个序列中的记录”基本有序“时,再对全体记录进行一次直接插入排序。 排序过程:先取一个正整数d1n,把所有相隔d1的记录放一组,组内进行直接插入排序;然后取d2d1,重复上述分组和排序操作;直至di=1,即所有记录放进一个组中排序为止,算法描述,Void ShellInsert(SqList /由ditak得到跨度 ShellSort,算法描述,#define T 3 int d=5,3,1;,49,13,38,27,27,4,55,38,65,48,97,55,76,4,希尔排序特
7、点 子序列的构成不是简单的“逐段分割”,而是将相隔某个增量的记录组成一个子序列 希尔排序可提高排序速度,因为 分组后n值减小,n更小,而T(n)=O(n),所以T(n)从总体上看是减小了 关键字较小的记录跳跃式前移,在进行最后一趟增量为1的插入排序时,序列已基本有序 增量序列取法 无除1以外的公因子 最后一个增量值必须为1,冒泡排序 将第一个记录的关键字与第二个记录的关键字进行比较,若为逆序r1.keyr2.key,则交换;然后比较第二个记录与第三个记录;依次类推,直至第n-1个记录和第n个记录比较为止第一趟冒泡排序,结果关键字最大的记录被安置在最后一个记录上 对前n-1个记录进行第二趟冒泡排
8、序,结果使关键字次大的记录被安置在第n-1个记录位置 重复上述过程,直到“在一趟排序过程中没有进行过交换记录的操作”为止,10.3 交换排序,例,38,49,76,97,13,97,27,97,30,97,13,76,76,76,27,30,13,65,27,65,30,65,13,13,49,49,30,49,27,38,27,38,30,38,算法评价 时间复杂度 最好情况(正序) 比较次数:n-1 移动次数:0 最坏情况(逆序) 比较次数:,移动次数:,空间复杂度:S(n)=O(1),T(n)=O(n),快速排序 基本思想:通过一趟排序,将待排序记录分割成独立的两部分,其中一部分记录的关
9、键字均比另一部分记录的关键字小,则可分别对这两部分记录进行排序,以达到整个序列有序 排序过程:对rst中记录进行一趟快速排序,附设两个指针i和j,设枢轴记录rp=rs,x=rp.key 初始时令i=s,j=t 首先从j所指位置向前搜索第一个关键字小于x的记录,并和rp交换 再从i所指位置起向后搜索,找到第一个关键字大于x的记录,和rp交换 重复上述两步,直至i=j为止 再分别对两个子序列进行快速排序,直到每个子序列只含有一个记录为止,完成一趟排序: ( 27 38 13) 49 (76 97 65 50),分别进行快速排序: ( 13) 27 (38) 49 (50 65) 76 (97),快
10、速排序结束: 13 27 38 49 50 65 76 97,49,27,49,65,13,49,49,97,算法描述,Int Partition(SqList ,Int Partition( SqList ,改写算法:,算法评价 时间复杂度 最好情况(每次总是选到中间值作枢轴)T(n)=O(nlog2n) 最坏情况(每次总是选到最小或最大元素作枢轴)T(n)=O(n) 空间复杂度:需栈空间以实现递归 最坏情况:S(n)=O(n) 一般情况:S(n)=O(log2n),已知序列 503,87,512,61,908,170,897,275,653,462, 采用快速排序方法对该序列作升序排序时的
11、每一趟的结果。 答:初始: 503,87,512,61,908,170,897,275,653,462 1趟:462,87,275,61,170 503 897,908,653,512 2趟:170,87,275,61 462,503 897,908,653,512 3趟:61,87 170 275 462,503 897,908,653,512 4趟:61 87 170 275 462,503 897,908,653,512 5趟:61,87,170 275 462,503 897,908,653,512 6趟:61,87,170,275,462,503 897,908,653,512 7趟
12、:61,87,170,275,462,503 512,653 897 908 8趟:61,87,170,275,462,503,512 653 897 908 9趟:61,87,170,275,462,503,512,653,897 908 10趟:61,87,170,275,462,503,512,653,897 ,908,选择排序(Selection Sort) 是每一趟在n-i+1(i= 1,2,3n-1)个记录中选择关键字最小的记录作为有序序列中第i个记录。 简单选择排序 排序过程 首先通过n-1次关键字比较,从n个记录中找出关键字最小的记录,将它与第一个记录交换 再通过n-2次比较,
13、从剩余的n-1个记录中找出关键字次小的记录,将它与第二个记录交换 重复上述操作,共进行n-1趟排序后,排序结束,10.4 选择排序,例,初始: 49 38 65 97 76 13 27 ,i=1,13,49,一趟: 13 38 65 97 76 49 27 ,i=2,27,38,六趟: 13 27 38 49 65 76 97 ,排序结束: 13 27 38 49 65 76 97,简单选择排序(Simple Selection Sort)的算法描述如下: void SelectSort (SqList ,算法评价 时间复杂度 记录移动次数 最好情况:0 最坏情况:3(n-1) 比较次数:,空
14、间复杂度:S(n)=O(1),时间复杂度:T(n)=O(n),堆排序 堆的定义:n个元素的序列(k1,k2,kn),当且仅当满足下列关系时,称之为堆,例 (96,83,27,38,11,9),例 (13,38,27,50,76,65,49,97),可将堆序列看成完全二叉树,则堆顶 元素(完全二叉树的根)必为序列中 n个元素的最小值或最大值,堆排序:将无序序列建成一个堆,得到关键字最小(或最大)的记录;输出堆顶的最小(大)值后,使剩余的n-1个元素重又建成一个堆,则可得到n个元素的次小值;重复执行,得到一个有序序列,这个过程叫 堆排序需解决的两个问题: 如何由一个无序序列建成一个堆? 如何在输出
15、堆顶元素之后,调整剩余元素,使之成为一个新的堆? 第二个问题解决方法筛选 方法:输出堆顶元素之后,以堆中最后一个元素替代之;然后将根结点值与左、右子树的根结点值进行比较,并与其中小者进行交换;重复上述操作,直至叶子结点,将得到新的堆,称这个从堆顶至叶子的调整过程为“筛选”,例,第一个问题解决方法 如何由一个无序序列建成一个堆? 方法:从无序序列的第n/2个元素(即此无序序列对应的完全二叉树的最后一个非终端结点)起,至第一个元素止,进行反复筛选,例 含8个元素的无序序列(49,38,65,97,76,13,27,50),堆排序:,将无序序列建成一个堆,得到关键字最小(或最大)的记录; 输出堆顶的
16、最小(大)值后,使剩余的n-1个元素重又建成一个堆,则可得到n个元素的次小值;重复执行,得到一个有序序列,这个过程叫,假设待排关键字序列为: 34, 39, 20, 65, 47, 12, 98, 73, 81, 56 ,1)先将它调整为大顶堆: 98, 81, 34, 73, 56, 12, 20, 39, 65, 47 ,2)互换堆顶和待排序列中的最后的关键字: 47, 81, 34, 73, 56, 12, 20, 39, 65, 98 3)在待排序列中舍去最大关键字,将其余部分重新调整为堆: 81, 73, 34, 65, 56, 12, 20, 39, 47 98,堆排序的算法 Ty
17、pe SqList HeapType; Void HeapAdjust (HeapType ,算法评价 时间复杂度:最坏情况下T(n)=O(nlogn) 空间复杂度:S(n)=O(1),Void HeapSort (HeapType (从根结点向下) ,已知序列 503,87,512,61,908,170,897,275,653,462,采用堆排序方法对该序列作降序排序时的每一趟的结果 答:初始化为极大堆: 908,653,897,503,462,170,512,275,61,87 (1)908(897,653,512,503,462,170,87,275,61) (2)908,897(653
18、,503,512,275,462,170,87,61) (3)908,897,653(512,503,170,275,462,61,87) (4) 908,897,653,512(503,462,170,275,87,61) (5)908,897,653,512,503(462,275,170,61,87) (6)908,897,653,512,503,462(275,87,170,61) (7)908,897,653,512,503,462,275(170,87,61) (8)908,897,653,512,503,462,275,170(87,61) (9)908,897,653,512,
19、503,462,275,170,87(61) (10)908,897,653,512,503,462,275,170,87,61,10.4 归并排序 归并将两个或两个以上的有序表组合成一个新的有序表,叫 2-路归并排序 排序过程 设初始序列含有n个记录,则可看成n个有序的子序列,每个子序列长度为1 两两合并,得到n/2个长度为2或1的有序子序列 再两两合并,如此重复,直至得到一个长度为n的有序序列为止,例,初始关键字: 49 38 65 97 76 13 27,一趟归并后: 38 49 65 97 13 76 27,二趟归并后: 38 49 65 97 13 27 76,三趟归并后: 13 2
20、7 38 49 65 76 97,void Merge (RcdType SR ,RcdType ,Void Msort (RcdType SR ,RcdType ,算法评价 时间复杂度:T(n)=O(nlog2n) 空间复杂度:S(n)=O(n),21 25 49 25* 16 08,21 25 49,25* 16 08,21,25,49,25 49,21,25*,16 08,25*,16,08,21 25 49 25* 16 08,25* 16 08,21 25 49,16 08,25*,25 49,21,21,25*,16,08,49,25,递 归,回 推,迭代的归并排序的时间复杂度,M
21、ergeSort调用 log2n 次,总的时间复杂度为O(n log2n) 空间开销为需要一个与原待排序对象数组同样大小的辅助数组。 迭代的归并排序是稳定的排序方法。,10.5 基数排序 多关键字排序定义:,例 对52张扑克牌按以下次序排序: 23A23A 23A23A 两个关键字:花色( ) 面值(23A) 并且“花色”地位高于“面值”,多关键字排序方法 最高位优先法(MSD):先对最高位关键字k1(如花色)排序,将序列分成若干子序列,每个子序列有相同的k1值;然后让每个子序列对次关键字k2(如面值)排序,又分成若干更小的子序列;依次重复,直至就每个子序列对最低位关键字kd排序;最后将所有子
22、序列依次连接在一起成为一个有序序列,最低位优先法(LSD):从最低位关键字kd起进行排序,然后再对高一位的关键字排序,依次重复,直至对最高位关键字k1排序后,便成为一个有序序列 MSD与LSD不同特点 按MSD排序,必须将序列逐层分割成若干子序列,然后对各子序列分别排序 按LSD排序,不必分成子序列,对每个关键字都是整个序列参加排序;并且可不通过关键字比较,而通过若干次分配与收集实现排序 链式基数排序 基数排序:借助“分配”和“收集”对单逻辑关键字进行排序的一种方法 链式基数排序:用链表作存储结构的基数排序,排序方法 平均时间 最坏情况 辅助存储 简单排序 O( n ) O ( n ) O(1
23、) 快速排序 O n(n) O ( n ) O (n) 堆 排序 O n(n) O n(n) O (1) 归并排序 O n(n) O n(n) O( n ) 基数排序 O(d(n+rd) O(d(n+rd) O ( rd ),10.7各种内部排序方法的比较讨论,各种内排序方法的比较 1从时间复杂度比较,从平均时间复杂度来考虑,直接插入排序、冒泡排序、简单选择排序是三种简单的排序方法,时间复杂度都为O(n2),而快速排序、堆排序、二路归并排序的时间复杂度都为O(nlog2n),希尔排序的复杂度介于这两者之间。若从最好的时间复杂度考虑,则直接插入排序和冒泡排序的时间复杂度最好,为O(n),其它的最好情形同平均情形相同。若从最坏的时间复杂度考虑,则快速排序的为O(n2),直接插入排序、冒泡排序、希
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年(中级消防设施操作员)基础知识考试题库(含答案)
- 高三数学一轮复习对勾函数与飘带函数应用教学设计
- 2026年8月影像技师考试消化内科肠易激综合征指南解读题及答案
- 高中二年级德育主题班会《识破电诈迷局守护青春钱袋》教学设计
- 2026年DRG-DIP付费业务测试题(含答案)
- 2026年CPA税法增值税综合题库(含答案)
- 2026年新余市烟草专卖局人员招聘考试备考试题及详细答案解析
- 2026年新疆中泰集团有限责任公司人员招聘考试备考题库及详细答案解析
- 2026年济南一建集团有限公司人员招聘考试模拟试题及详细答案解析
- 2026年青岛演艺集团有限公司人员招聘笔试备考题库及详细答案解析
- 2026-2027学年川教版(新教材)小学信息科技六年级上册(全册)教学设计(附目录p73)
- 2026中国MEMS传感器产业技术创新与下游应用拓展专题报告
- 1.1走进互联网世界课件-七年级上册《信息技术》西大版
- 脊柱侧弯课件
- 2025年成人高考专升本《政治》真题(含答案)
- 生命早期一千天课件
- XX县XX镇XX中学改造扩建工程项目可行性研究报告
- JG/T 169-2016建筑隔墙用轻质条板通用技术要求
- 低压电气箱内置自动消防技术规范
- 《陶瓷釉下彩绘技艺》课件
- 鸟类分类培训课件
评论
0/150
提交评论