




免费预览已结束,剩余72页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第十章内部排序,10.1概述,10.2插入排序,10.3快速排序,10.4选择排序,10.5归并排序,10.6基数排序,10.7各种排序方法的综合比较,10.1概述,一、何为排序,二、内部排序和外部排序,三、内部排序方法的分类,一、何为排序?,将一组“无序”的记录序列调整为“有序”的记录序列。,例如:将如下序列,52,49,80,36,14,58,61,23,97,75,调整为,14,23,36,49,52,58,61,75,80,97,二、内部排序和外部排序,整个排序过程不需要访问外存便能完成,则为内部排序;,反之,若参加排序的记录很多,整个排序过程不可能在内存中完成,称为外部排序。,三、内部排序的方法,内部排序的过程实质是一个逐步扩大有序序列长度的过程。,经过一趟排序,有序序列区,无序序列区,有序序列区,无序序列区,基于不同的“扩大”有序序列长度的方法,内部排序大致可分下列几种类型:,插入类,交换类,选择类,归并类,其它方法,1.插入类,将无序子序列中的一个(或几个)“插入”到有序序列中,从而增加有序子序列的长度。,2.交换类,通过“交换”无序序列中的记录以得到其中最小或最大记录,将它加入到有序子序列中,从而增加有序子序列的长度。,3.选择类,从记录的无序子序列中“选择”最小或最大的记录,将它加入到有序子序列中,从而增加有序子序列的长度。,4.归并类,通过“归并”两个或两个以上的记录有序子序列,逐步增加有序序列的长度。,5.其它方法,10.2插入排序,有序序列R1.i-1,Ri,无序序列Ri.n,插入排序的基本思想,有序序列R1.i,无序序列Ri+1.n,(一趟)插入排序分三步走:,3将Ri插入到Rj+1的位置上。,2将Rj+1.i-1中的所有记录均后移一个位置;,1在R1.i-1中查找Ri的插入位置,即R1.j.keyRi.keyRj+1.i-1.key;,直接插入排序(基于顺序查找),不同的实现方法导致不同的算法,折半插入排序(基于折半查找),希尔排序(基于逐趟缩小增量),一、直接插入排序,利用“顺序查找”实现在R1.i-1中查找Ri的插入位置。,voidInsertionSort(SqList+i)if(L.ri.keyL.ri-1.key)/InsertionSort,L.r0=L.ri;/设置监视哨for(j=i-1;L.r0.keyL.rj.key;-j)L.rj+1=L.rj;/记录后移L.rj+1=L.r0;/插入到正确位置,因为R1.i-1是一个有序序列,因此可以利用折半查找在R1.i-1中找出Ri的插入位置。称这种排序为折半插入排序。,二、折半插入排序,voidBiInsertionSort(SqListi=high+1;-j)L.rj+1=L.rj;/记录后移,L.rhigh+1=L.r0;/插入,low=1;high=i-1;while(low=high),m=(low+high)/2;/折半,if(L.r0.keyL.rm.key)high=m-1;/插入点在低半区elselow=m+1;/插入点在高半区,三、希尔排序(又称缩小增量排序),也是一种插入排序方法,但时间复杂度有较大改进基本思想对无序序列先作“宏观”调整,后作“微观”调整所谓“宏观”调整,指的是,“跳跃式”的插入排序,将序列分成若干子序列,对每个子序列进行插入排序。,其中,d称为增量,它的值在排序过程中逐渐缩小,直至为1,例如:将n个记录分成d个子序列:R1,R1+d,R1+2d,R1+kdR2,R2+d,R2+2d,R2+kdRd,R2d,R3d,Rkd,R(k+1)d,voidShellInsert(SqList/插入/if/ShellInsert,voidShellSort(SqList/一趟增量为deltak的插入排序/ShellSort,首先对无序序列进行“划分”,之后将两个子序列“递归”进行快速排序。,无序的记录序列,无序子序列1,无序子序列2,枢轴,划分,分别进行快速排序,10.3快速排序,intpartition(inta,intleft,intright)/划分intlow=left;inthigh=right;intkey=alow;/第一个记录作为枢轴while(low=key)high-;alow=ahigh;/将比枢轴小的移到低端while(low=right)return;s=partition(a,left,right);Qsort(a,left,s-1);/排序前半部分Qsort(a,s+1,right);/排序后半部分,10.4选择排序,简单选择排序,堆排序,树形选择排序,一、简单选择排序,有序序列R1.i-1,无序序列Ri.n,第i趟,从中选出最小的记录,有序序列R1.i,无序序列Ri+1.n,voidSelectSort(ElemR,intn)/对记录序列R1.n作简单选择排序。for(i=1;i=”成立,则说明已找到rc的插/入位置s,不需要继续往下调整,Rs=Rj;s=j;/否则记录上移,尚需继续往下调整,if(j0;-i)HeapAdjust(H.r,i,H.length);/建大顶堆,for(i=H.length;i1;-i)H.r1H.ri;/将堆顶记录和当前无序序列/H.r1.i中最后一个记录相互交换HeapAdjust(H.r,1,i-1);/对H.r1进行筛选,10.5归并排序,归并排序的过程基于下列基本思想:将两个或两个以上的有序子序列“归并”为一个有序序列。,通常采用的是2-路归并排序。即:将两个位置相邻的有序子序列,归并为一个有序序列。,有序序列Ri.n,有序子序列Ri.m,有序子序列Rm+1.n,这个操作对顺序表而言,是轻而易举的。,12,i,k,j,15,29,22,40,51,60,63,41,84,70,for(k=i,j=m+1;i=m,voidMerge(RcdTypeSR,RcdTypei=m,if(i=m)TRk.n=SRi.m;/将剩余的SRi.m复制到TR,if(j=n)TRk.n=SRj.n;/将剩余的SRj.n复制到TR,归并排序的算法,如果无序序列Rs.t的两部分Rs.(s+t)/2和R(s+t)/2+1.t分别按关键字有序,则利用上述归并算法很容易将它们归并成整个序列是一个有序序列。,因此,应该先分别对这两部分进行2-路归并排序。,例如:,52,23,80,36,68,14(s=1,t=6),52,23,8036,68,14,52,2380,52,23,52,23,52,80,36,6814,3668,36,68,14,36,68,14,23,36,52,68,80,23,归并,归并,voidMsort(RcdTypeSR,RcdTypeelse/Msort,m=(s+t)/2;/将SRs.t平分为SRs.m和SRm+1.t,Msort(SR,TR2,s,m);/递归地将SRs.m归并为有序的TR2s.mMsort(SR,TR2,m+1,t);/递归地SRm+1.t归并为有序的TR2m+1.t,Merge(TR2,TR1,s,m,t);/将TR2s.m和TR2m+1.t归并到TR1s.t,voidMergeSort(SqList/MergeSort,容易看出,对n个记录进行归并排序的时间复杂度为(nlogn)。即:每一趟归并的时间复杂度为O(n),总共需进行log2n趟。,10.6基数排序,基数排序是一种借助“多关键字排序”的思想来实现“单关键字排序”的内部排序算法。,多关键字的排序,链式基数排序,一、多关键字的排序,n个记录的序列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的不同值将记录序列分成若干子序列之后,分别对K1进行排序,.,依次类推,直至最后对最次位关键字排序完成为止。,先对Kd-1进行排序,然后对Kd-2进行排序,.,依次类推,直至对最主位关键字K0排序完成为止。,假设学生记录含三个关键字:系别、班号和班内的序列号,其中以系别为最主位关键字。LSD的排序过程如下:,无序序列,对K2排序,对K1排序,对K0排序,3,2,30,1,2,15,3,1,20,2,3,18,2,1,20,1,2,15,2,3,18,3,1,20,2,1,20,3,2,30,3,1,20,2,1,20,1,2,15,3,2,30,2,3,18,1,2,15,2,1,20,2,3,18,3,1,20,3,2,30,二、链式基数排序,假如多关键字的记录序列中,每个关键字的取值范围相同,则按LSD法进行排序时,可以采用“分配-收集”的方法,其好处是不需要进行关键字间的比较。,对于数字型或字符型的单关键字,可以看成是由多个数位或多个字符构成的多关键字,采用这种“分配-收集”的办法进行排序,称作基数排序法。,例如:对下列这组关键字209,386,768,185,247,606,230,834,539,首先按其“个位数”取值分别为0,1,9“分配”成10组,之后按从0至9的顺序将它们“收集”在一起;,然后按其“十位数”取值分别为0,1,9“分配”成10组,之后再按从0至9的顺序将它们“收集”在一起;,最后按其“百位数”重复一遍上述操作。,实现基数排序时,为减少辅助存储空间,应采用链表作存储结构,即链式基数排序,具体作法为:,待排序记录以指针相链,构成一个链表;,“分配”时,按当前“关键字位”取值,将记录分配到不同的“链队列”中,每个队列中的“关键字位”相同;,“收集”时,按当前关键字位取值从小到大将各队列首尾相链,构成一个链表;,对每个关键字位均重复2和3两步。,例如:,p369367167239237138230139,进行第一次分配,进行第一次收集,f0r0,f7r7,f8r8,f9r9,p230,230,367,167,237,367167237,138,368239139,369,239,139,138,进行第二次分配,p230237138239139,p230367167237138368239139,f3r3,f6r6,230,237,138,239,139,367,167,368,367167368,进行第二次收集,进行第三次收集之后便得到记录的有序序列,f1r1,p230237138239139367167368,进行第三次分配,f2r2,f3r3,138,139,167,230,237,239,367,368,p138139167,230237239,367368,基数排序的时间复杂度为O(d(n+rd),其中:分配为O(n)收集为O(rd)(rd为“基”)d为“分配-收集”的趟数,10.7各种排序方法的比较,一、时间性能,1.平均的时间性能,基数排序,时间复杂度为O(nlogn):,快速排序、堆排序和归并排序,时间复杂度为O(n2):,直接插入排序、起泡排序和简单选择排序,时间复杂度为O(n):,2.当待排记录序列按关键字顺序有序时,3.简单选择排序、堆排序和归并排序的时间性能不随记录序列中关键字的分布而改变。,直接插入排序和起泡排序能达到O(n)的时间复杂度,若枢轴选取不当,快速排序的时间性能会蜕化为O(n2)。,二、空间性能,指的是排序过程中所需的辅助空间大小,1.所有的简单排序方法(包括:直接插入、起泡和简单选择)和堆排序的空间复杂度为O(1);,2.快速排序为O(logn),为递归程序执行过程中,栈所需的辅助空间;,3.归并排序所需辅助空间最多,其空间复杂度为O(n);,4.链式基数排序需附设队列首尾指针,则空间复杂度为O(rd)。,三、排序方法的稳定性,1.稳定的排序方法指的是,对于两个关键字相等的记录,它们在序列中的相
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 押题宝典教师招聘之《幼儿教师招聘》题库及参考答案详解【综合卷】
- 2025内蒙古呼伦贝尔陆港国际有限公司招聘递补笔试备考及答案详解(各地真题)
- 教师招聘之《小学教师招聘》模拟题库(模拟题)附答案详解
- 2025呼伦贝尔海拉尔区建设街道办事处招聘城镇公益性岗位人员笔试备考及答案详解(名校卷)
- 预防学生欺凌预案
- 教师招聘之《小学教师招聘》通关训练试卷详解附完整答案详解(夺冠系列)
- 2025年贵州省考试题及答案
- 2025年教师招聘之《小学教师招聘》题库综合试卷含答案详解(能力提升)
- 押题宝典教师招聘之《小学教师招聘》考试题库含完整答案详解【名师系列】
- 2025年教师招聘之《小学教师招聘》练习题(一)【培优b卷】附答案详解
- 数字产品服务使用协议书
- 中国邮政储蓄银行个人额借款合同4篇
- 重庆市南开中学高2025-2026学年高三上学期开学第一次检测语文试卷
- 4人合股合同协议书范本
- 【2025年】铁路机车车辆驾驶员资格考试模拟试卷(410题)及参考答案
- 【2025年】全民科学素质竞赛网络知识竞赛考试试卷题库(290题)附答案
- 2023-2025年高考生物试题分类汇编:孟德尔两大遗传定律原卷版
- 2025年机器人标准化行业发展趋势分析报告
- 2025年军考政治时事政治热点试题题库含答案
- 2025年村医笔试重点题库
- 2025年儿科学测验试卷答案及解析
评论
0/150
提交评论