




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1第10章 内部排序210.1 概述10.2 插入排序10.3 快速排序10.4 选择排序10.7 各种排序方法的综合比较310.1 概 述一、排序的定义二、内部排序和外部排序三、内部排序方法的分类4一、什么是排序?排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列。例如:将下列关键字序列52, 49, 80, 36, 14, 58, 61, 23, 97, 75调整为14, 23, 36, 49, 52, 58, 61 ,75, 80, 975 一般情况下,假设含n个记录的序列为 R1, R2, , Rn 其相应的关键字序列为 K1, K2, ,Kn
2、这些关键字相互之间可以进行比较,即在它们之间存在着这样一个关系 : Kp1Kp2Kpn按此固有关系将上式记录序列重新排列为 Rp1, Rp2, ,Rpn 的操作称作排序。6二、内部排序和外部排序若整个排序过程不需要访问外存便能完成,则称此类排序问题为内部排序; 反之,若参加排序的记录数量很大, 整个序列的排序过程不可能在内存中 完成,则称此类排序问题为外部排序。7三、内部排序的方法内部排序的过程是一个逐步扩大记录的有序序列长度的过程。经过一趟排序有序序列区无 序 序 列 区有序序列区无 序 序 列 区8基于不同的“扩大” 有序序列长度的方法,内部排序方法大致可分下列几种类型:插入类交换类选择类
3、 归并类其它方法91. 插入类将无序子序列中的一个或几个记录“插入”到有序序列中,从而增加记录的有序子序列的长度。102. 交换类通过“交换”无序序列中的记录从而得到其中关键字最小或最大的记录,并将它加入到有序子序列中,以此方法增加记录的有序子序列的长度。113. 选择类从记录的无序子序列中“选择”关键字最小或最大的记录,并将它加入到有序子序列中,以此方法增加记录的有序子序列的长度。124. 归并类通过“归并”两个或两个以上的记录有序子序列,逐步增加记录有序序列的长度。5. 其它方法13待排记录的数据类型定义如下:#define MAXSIZE 1000 / 待排顺序表最大长度typedef
4、int KeyType; / 关键字类型为整数类型typedef struct KeyType key; / 关键字项 InfoType otherinfo; / 其它数据项 RcdType; / 记录类型typedef struct RcdType rMAXSIZE+1; / r0闲置 int length; / 顺序表长度 SqList; / 顺序表类型14 10. 2 插 入 排 序15有序序列R1.i-1Ri无序序列 Ri.n一趟直接插入排序的基本思想:有序序列R1.i无序序列 Ri+1.n16实现“一趟插入排序”可分三步进行:3将Ri 插入(复制)到Rj+1的位置上。2将Rj+1.i
5、-1中的所有记录均后移 一个位置;1在R1.i-1中查找Ri的插入位置, R1.j.key Ri.key Rj+1.i-1.key;17直接插入排序(基于顺序查找)表插入排序(基于链表存储)不同的具体实现方法导致不同的算法描述折半插入排序(基于折半查找)希尔排序(基于逐趟缩小增量)18一、直接插入排序利用 “顺序查找”实现“在R1.i-1中查找Ri的插入位置”算法的实现要点:19从Ri-1起向前进行顺序查找, 监视哨设置在R0;R0 = Ri; / 设置“哨兵”循环结束表明Ri的插入位置为 j +1R0jRifor (j=i-1; R0.keyRj.key; -j); / 从后往前找j=i-1
6、插入位置20 对于在查找过程中找到的那些关键字不小于Ri.key的记录,并在查找的同时实现记录向后移动;for (j=i-1; R0.keyRj.key; -j) Rj+1 = RjR0jRij= i-1上述循环结束后可以直接进行“插入”插入位置21令 i = 2,3,, n, 实现整个序列的排序。for ( i=2; i=n; +i ) if (Ri.keyRi-1.key) 在 R1.i-1中查找Ri的插入位置; 插入Ri ; 如:1、2、4、3.22void InsertionSort ( SqList &L ) / 对顺序表 L 作直接插入排序。 for ( i=2; i=L.leng
7、th; +i ) if (L.ri.key L.ri-1.key) / InsertSortL.r0 = L.ri; / 复制为监视哨for ( j=i-1; L.r0.key L.rj.key; - j ) L.rj+1 = L.rj; / 记录后移L.rj+1 = L.r0; / 插入到正确位置23 因为 R1.i-1 是一个按关键字有序的有序序列,则可以利用折半查找实现“在R1.i-1中查找Ri的插入位置”,如此实现的插入排序为折半插入排序。二、折半插入排序24void BiInsertionSort ( SqList &L ) / BInsertSort在 L.r1.i-1中折半查找插
8、入位置;for ( i=2; i=high+1; -j ) L.rj+1 = L.rj; / 记录后移L.rhigh+1 = L.r0; / 插入2514 36 49 52 8058 61 23 97 75ilowhighmmlowlowmhigh14 36 49 52 58 61 80 23 97 75ilowhighmhighmhighmlow例如:再如:插入位置插入位置L.rL.r26low = 1; high = i-1;while (low=high) m = (low+high)/2; / 折半if (L.r0.key 1) / while / BubbleSorti = n;i
9、= lastExchangeIndex; / 本趟进行过交换的 / 最后一个记录的位置 if (Rj+1.key Rj.key) Swap(Rj, Rj+1); lastExchangeIndex = j; /记下进行交换的记录位置 /iffor (j = 1; j i; j+)lastExchangeIndex = 1;34注意:2. 一般情况下,每经过一趟“起泡”,“i 减一”,但并不是每趟都如此。例如:2553157989i=7i=6for (j = 1; j i; j+) if (Rj+1.key Rj.key) 13i=21. 起泡排序的结束条件为, 最后一趟没有进行“交换记录”。3
10、5二、一趟快速排序(一次划分)目标:找一个记录,以它的关键字作为“枢轴”,凡其关键字小于枢轴的记录均移动至该记录之前,反之,凡关键字大于枢轴的记录均移动至该记录之后。致使一趟排序之后,记录的无序序列Rs.t将分割成两部分:Rs.i-1和Ri+1.t,且 Rj.key Ri.key Rj.key (sji-1) 枢轴 (i+1jt)。36stlowhigh设 Rs=52 为枢轴 将 Rhigh.key 和 枢轴的关键字进行比较,要求Rhigh.key 枢轴的关键字 将 Rlow.key 和 枢轴的关键字进行比较,要求Rlow.key 枢轴的关键字high23low80high14low52例如R
11、052lowhighhighhighlow37 可见,经过“一次划分” ,将关键字序列 52, 49, 80, 36, 14, 58, 61, 97, 23, 75 调整为: 23, 49, 14, 36, (52) 58, 61, 97, 80, 75 在调整过程中,设立了两个指针: low 和high,它们的初值分别为: s 和 t, 之后逐渐减小 high,增加 low,并保证 Rhigh.key52,和 Rlow.key52,否则进行记录的“交换”。38int Partition (RedType& R, int low, int high) pivotkey = Rlow.key;
12、while (lowhigh) while (low=pivotkey) -high; RlowRhigh; while (lowhigh & Rlow.key=pivotkey) +low; RlowRhigh; return low; / 返回枢轴所在位置 / Partition39int Partition (RedType R, int low, int high) / Partition R0 = Rlow; pivotkey = Rlow.key; / 枢轴 while (lowhigh) while(low=pivotkey) - high; / 从右向左搜索Rlow = Rhi
13、gh;while (lowhigh & Rlow.key=pivotkey) + low; / 从左向右搜索Rhigh = Rlow;Rlow = R0; return low;40三、快速排序 首先对无序的记录序列进行“一次划分”,之后分别对分割所得两个子序列“递归”进行快速排序。无 序 的 记 录 序 列无序记录子序列(1)无序子序列(2)枢轴一次划分分别进行快速排序41void QSort (RedType & R, int s, int t ) / 对记录序列Rs.t进行快速排序 if (s t) / 长度大于1 / QSortpivotloc = Partition(R, s, t)
14、; / 对 Rs.t 进行一次划分QSort(R, s, pivotloc-1); / 对低子序列递归排序,pivotloc是枢轴位置QSort(R, pivotloc+1, t); / 对高子序列递归排序42void QuickSort( SqList & L) / 对顺序表进行快速排序 QSort(L.r, 1, L.length); / QuickSort 第一次调用函数 Qsort 时,待排序记录序列的上、下界分别为 1 和 L.length。4310.4 选择 排 序简 单 选 择 排 序堆 排 序44一、简单选择排序假设排序过程中,待排记录序列的状态为:有序序列R1.i-1无序序列
15、 Ri.n 第 i 趟简单选择排序从中选出关键字最小的记录有序序列R1.i无序序列 Ri+1.n45简单选择排序的算法描述如下:void SelectSort (Elem R, int n ) / 对记录序列R1.n作简单选择排序。 for (i=1; in; +i) / 选择第 i 小的记录,并交换到位 / SelectSortj = SelectMinKey(R, i); / 在 Ri.n 中选择关键字最小的记录if (i!=j) RiRj; / 与第 i 个记录交换46二、堆排序堆是满足下列性质的数列r1, r2, ,rn:或堆的定义:12, 36, 27, 65, 40, 34, 98
16、, 81, 73, 55, 49例如:是小顶堆12, 36, 27, 65, 40, 14, 98, 81, 73, 55, 49不是堆(小顶堆)(大顶堆)47rir2i r2i+1 若将该数列视作完全二叉树,则 r2i 是 ri 的左孩子; r2i+1 是 ri 的右孩子。1236276549817355403498例如:是堆14不48堆排序即是利用堆的特性对记录序列进行排序的一种排序方法。例如:建大顶堆 98, 81, 49, 73, 36, 27, 40, 55, 64, 12 12, 81, 49, 73, 36, 27, 40, 55, 64, 98 交换 98 和 12重新调整为大
17、顶堆 81, 73, 49, 64, 36, 27, 40, 55, 12, 98 40, 55, 49, 73, 12, 27, 98, 81, 64, 36 经过筛选49如何“建堆”?两个问题:如何“筛选”?定义堆类型为:typedef SqList HeapType; / 堆采用顺序表表示之50所谓“筛选”指的是,对一棵左/右子树均为堆的完全二叉树,“调整”根结点使整个二叉树也成为一个堆。堆堆筛选5198814973556412362740例如:是大顶堆12但在 98 和 12 进行互换之后,它就不是堆了,因此,需要对它进行“筛选”。98128173641298比较比较52建堆是一个从下
18、往上进行“筛选”的过程。40554973816436122798例如: 排序之前的关键字序列为123681734998817355 现在,左/右子树都已经调整为堆,最后只要调整根结点,使整个二叉树是个“堆”即可。984940643612275310.7 各种排序方法的综合比较54一、时间性能1. 平均的时间性能基数排序时间复杂度为 O(nlogn):快速排序、堆排序和归并排序时间复杂度为 O(n2):直接插入排序、起泡排序和简单选择排序时间复杂度为 O(n):552. 当待排记录序列按关键字顺序有序时3. 简单选择排序、堆排序和归并排序的时间性能不随记录序列中关键字的分布而改变。 直接插入排序
19、和起泡排序能达到O(n)的时间复杂度, 快速排序的时间性能蜕化为O(n2) 。56二、空间性能指的是排序过程中所需的辅助空间大小1. 所有的简单排序方法(包括:直接插入、起泡和简单选择) 和堆排序的空间复杂度为O(1);2. 快速排序为O(logn),为递归程序执行过程中,栈所需的辅助空间;573. 归并排序所需辅助空间最多,其空间复杂度为 O(n);4. 链式基数排序需附设队列首尾指针,则空间复杂度为 O(rd)。58三、排序方法的稳定性能 1. 稳定的排序方法指的是,对于两个关键字相等的记录,它们在序列中的相对位置,在排序之前和经过排序之后,没有改变。 2. 当对多关键字的记录序列进行LSD方法排序时,必须采用稳定的排序方法。排序之前 : Ri(K) Rj(K) 排序之后 : Ri(K) Rj(K) 59例如: 排序前 ( 56, 34, 47, 23, 66, 18, 82, 47 )若排序后得到结果 ( 18, 23, 34, 47, 47, 56, 66, 82 )则称该排序方法是稳定的;若排
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025租赁信息技术设备合同
- 颅骨纤维肉瘤的临床护理
- 儿童咳嗽的临床护理
- 面具样面容的临床护理
- 教学设计与学案第七单元
- 2025果品购销合同
- 2025家居用品采购合同(FOB)
- 2025年期货从业资格之期货基础知识题库练习试卷A卷附答案
- 2025建筑材料采购合同模板
- 2025年咨询工程师之工程项目组织与管理押题练习试卷A卷附答案
- GB/T 44252.1-2024物联网运动健康监测设备第1部分:数据分类和描述
- 假结婚合同书
- DL∕T 261-2012 火力发电厂热工自动化系统可靠性评估技术导则
- 2024年山东省春季高考数学试卷试题真题(含答案)
- 平安银行贷款合同范本
- JT-T-1078-2016道路运输车辆卫星定位系统视频通信协议
- 炎症性肠病的外科治疗外科技术的发展
- 区域绿化补植恢复工程 投标方案(技术方案)
- SAP WM模块前台操作详解(S4版本)
- (正式版)HGT 22820-2024 化工安全仪表系统工程设计规范
- 《涉河建设项目防洪评价分析与计算导则》
评论
0/150
提交评论