数据结构(C语言版)第8章-排序.ppt
- 文档编号:30871187
- 上传时间:2024-09-13
- 格式:PPT
- 页数:228
- 大小:16.22MB
数据结构(C语言版)第8章-排序.ppt
《数据结构(C语言版)第8章-排序.ppt》由会员分享,可在线阅读,更多相关《数据结构(C语言版)第8章-排序.ppt(228页珍藏版)》请在冰豆网上搜索。
排序第8章数据结构(C语言版)数据结构逻辑结构线性结构(线性表、栈、队、串、数组)非线性结构树结构图结构物理(存储结构)顺序结构链式结构数据运算插入运算删除运算修改运算查找运算排序运算掌握排序的基本概念和各种排序方法的特点,并能加以灵活应用熟练掌握直接插入排序、折半插入排序、起泡排序、直接选择排序、快速排序的排序算法及其性能分析掌握希尔排序、归并排序、堆排序、基数排序的方法及其性能分析掌握外部排序方法中败者树的建立及归并方法,掌握置换-选择排序的过程和最佳归并树的构造方法。
01OPTION02OPTION03OPTION04OPTIONtarget目标目录导航8.18.28.38.48.58.68.7概述插入排序交换排序选择排序归并排序基数排序外部排序Contents1.什么是排序?
将一组杂乱无章的数据按一定规律顺次排列起来。
2.排序的目的是什么?
存放在数据表中按关键字排序便于查找!
概述3.什么叫内部排序?
什么叫外部排序?
若待排序记录都在内存中,称为内部排序;若待排序记录一部分在内存,一部分在外存,则称为外部排序。
注:
外部排序时,要将数据分批调入内存来排序,中间结果还要及时放入外存,显然外部排序要复杂得多。
概述4.排序算法的好坏如何衡量?
概述空间效率占内存辅助空间的大小稳定性A和B的关键字相等,排序后A、B的先后次序保持不变,则称这种排序算法是稳定的。
时间效率排序速度(比较次数与移动次数)记录序列以顺序表存储Typedefstruct/定义每个记录(数据元素)的结构KeyTypekey;/关键字InfoTypeotherinfo;/其它数据项RedType;Typedefstruct/定义顺序表的结构RedTyperMAXSIZE+1;/存储顺序表的向量/r0一般作哨兵或缓冲区intlength;/顺序表的长度SqList;#defineMAXSIZE20/设记录不超过20个typedefintKeyType;/设关键字为整型量(int型)排序算法分类规则不同插入排序交换排序选择排序归并排序时间复杂度不同简单排序O(n2)先进排序O(nlog2n)目录导航8.18.28.38.48.58.68.7概述插入排序交换排序选择排序归并排序基数排序外部排序Contents插入排序基本思想:
即边插入边排序,保证子序列中随时都是排好序的每步将一个待排序的对象,按其关键码大小,插入到前面已经排好序的一组对象的适当位置上,直到对象全部插入为止。
直接插入排序(基于顺序查找)不同的具体实现方法导致不同的算法描述折半插入排序(基于折半查找)希尔排序(基于逐趟缩小增量)最简单的排序法!
插入排序直接插入排序排序过程:
整个排序过程为n-1趟插入,即先将序列中第1个记录看成是一个有序子序列,然后从第2个记录开始,逐个进行插入,直至整个序列有序。
【13】,6,3,31,9,27,5,11【6,13】,3,31,9,27,5,11【3,6,13】,31,9,27,5,11【3,6,13,31】,9,27,5,11【3,6,9,13,31】,27,5,11【3,6,9,13,27,31】,5,11【3,5,6,9,13,27,31】,11【3,5,6,9,11,13,27,31】例(13,6,3,31,9,27,5,11)21212525494925*25*161608080123456暂暂存存2121i=2i=3i=5i=4i=625252549494925*25*25*494916161625*25*0808494921212525494925*25*2121初态:
1616494925*25*2525212116160808完成!
将序列存入顺序表L中,将L.r0作为哨兵(21,25,49,25*,16,08)*表示后一个25直接插入排序有序序列R1.i-1Ri无序序列Ri.n插入排序的基本思想:
有序序列R1.i无序序列Ri+1.n插入排序的基本步骤:
在R1.i-1中查找Ri的插入位置,R1.j.keyRi.keyRj+1.i-1.key;01OPTION02OPTION03OPTION将Rj+1.i-1中的所有记录均后移一个位置;将Ri插入到Rj+1的位置上。
从Ri-1向前进行顺序查找,监视哨设置在R0if(L.ri.keyL.ri-1.key)R0=Ri;/设置“哨兵”Ri=Ri-1;for(j=i-2;R0.keyRj.key;-j)Rj+1=Rj;jRii-1插入位置直接插入排序关键字大于Ri.key的记录向后移动循环结束表明Ri的插入位置为j+1L.rj+1=L.r0;/插入到正确位置直接插入排序voidInsertSort(SqListL)inti,j;for(i=2;i=L.length;+i)if(L.ri.keyL.ri-1.key)/将L.ri插入有序子表L.r0=L.ri;/复制为哨兵L.ri=L.ri-1;for(j=i-2;L.r0.keyL.rj.key;-j)L.rj+1=L.rj;/记录后移L.rj+1=L.r0;/插入到正确位置算法分析设对象个数为n,则执行n-1趟比较次数和移动次数与初始排列有关最好情况下:
每趟只需比较1次,不移动总比较次数为n-121212525494925*25*16160808for(i=2;i=L.length;+i)if(L.ri.keyL.ri-1.key)最坏情况下:
第i趟比较i次,移动i+1次21212525494925*25*16160808算法分析比较次数:
移动次数:
if(L.ri.keyL.ri-1.key)L.r0=L.ri;/复制为哨兵L.ri=L.ri-1;L.rj+1=L.r0;/插入到正确位置若出现各种可能排列的概率相同,则可取最好情况和最坏情况的平均情况平均情况比较次数和移动次数为n2/4时间复杂度为o(n2)空间复杂度为o
(1)是一种稳定的排序方法21212525494925*25*1616080821212525494925*25*16160808012345算法分析折半插入排序直接插入排序减少关键字间的比较次数在插入ri时,利用折半查找法寻找ri的插入位置算法分析i=2折半插入排序i=3折半插入排序i=4折半插入排序i=5折半插入排序i=6折半插入排序voidBInsertSort(SqList&L)for(i=2;i=L.length;+i)L.r0=L.ri;low=1;high=i-1;while(low=high)m=(low+high)/2;if(L.r0.key=high+1;-j)L.rj+1=L.rj;L.rhigh+1=L.r0;/BInsertSort折半插入排序折半查找比顺序查找快,所以折半插入排序就平均性能来说比直接插入排序要快。
算法分析它所需要的关键码比较次数与待排序对象序列的初始排列无关,仅依赖于对象个数。
在插入第i个对象时,需要经过log2i+1次关键码比较,才能确定它应插入的位置。
算法分析当n较大时,总关键码比较次数比直接插入排序的最坏情况要好得多,但比其最好情况要差在对象的初始排列已经按关键码排好序或接近有序时,直接插入排序比折半插入排序执行的关键码比较次数要少折半插入排序的对象移动次数与直接插入排序相同,依赖于对象的初始排列减少了比较次数,但没有减少移动次数平均性能优于直接插入排序算法分析空间复杂度为o
(1)是一种稳定的排序方法时间复杂度为o(n2)希尔排序算法思想的出发点:
直接插入排序在基本有序时,效率较高在待排序的记录个数较少时,效率较高基本思想:
先将整个待排记录序列分割成若干子序列,分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。
希尔排序子序列的构成不是简单地“逐段分割”将相隔某个增量dk的记录组成一个子序列让增量dk逐趟缩短(例如依次取5,3,1)直到dk1为止。
小元素跳跃式前移最后一趟增量为1时,序列已基本有序平均性能优于直接插入排序优点技巧38例:
关键字序列T=(49,38,65,97,76,13,27,49*,55,04)0123456789104938659776132749*5504初态:
第1趟(dk=5)第2趟(dk=3)第3趟(dk=1)4913134938276549*9755760427386549*9755135576045513270427044949*4949*7638766565979713270449*7697ridk值较大,子序列中对象较少,速度较快;dk值逐渐变小,子序列中对象变多,但大多数对象已基本有序,所以排序速度仍然很快。
希尔排序voidShellSort(SqList&L,intdlta,intt)/按增量序列dlta0t-1对顺序表L作Shell排序for(k=0;kt;+k)ShellInsert(L,dltak);/增量为dltak的一趟插入排序/ShellSort希尔排序算法(主程序)dk值依次装在dltat中voidShellInsert(SqList&L,intdk)for(i=dk+1;i=L.length;+i)if(ri.key0&(r0.keyrj.key);j=j-dk)rj+dk=rj;rj+dk=r0;/对顺序表L进行一趟增量为dk的Shell排序,dk为步长因子/开始将ri插入有序增量子表/暂存在r0/关键字较大的记录在子表中后移/在本趟结束时将ri插入到正确位置希尔排序算法(其中某一趟的排序操作)时间复杂度是n和d的函数:
空间复杂度为o
(1)是一种不稳定的排序方法算法分析O(n1.25)O(1.6n1.25)经验公式如何选择最佳d序列,目前尚未解决最后一个增量值必须为1,无除1以外的公因子不宜在链式存储结构上实现目录导航8.18.28.38.48.58.68.7概述插入排序交换排序选择排序归并排序基数排序外部排序Contents交换排序基本思想:
两两比较,如果发生逆序则交换,直到所有记录都排好序为止。
起泡排序O(n2)快速排序O(nlog2n)基本思想:
每趟不断将记录两两比较,并按“前小后大”规则交换起泡排序21,25,49,25*,16,0821,25,25*,16,08,4921,25,16,08,25*,4921,16,08,25,25*,4916,08,21,25,25*,4908,16,21,25,25*,49起泡排序优点:
每趟结束时,不仅能挤出一个最大值到最后面位置,还能同时部分理顺其他元素;一旦下趟没有交换,还可提前结束排序voidmain()inta11;/*a0不用,之用a1a10*/inti,j,t;printf(nInput10numbers:
n);for(i=1;i=10;i+)scanf(%d,&ai);printf(n);for(j=1;j=9;j+)for(i=1;iai+1)t=ai;ai=ai+1;ai+1=t;/交换for(i=1;i0)&(flag=1)flag=0;for(j=1;jL.rj+1.key)flag=1;x=L.rj;L.rj=L.rj+1;L.rj+1=x;/交换/endifm-;/endwhile起泡排序算法分析设对象个数为n比较次数和移动次数与初始排列有关只需1趟排序,比较次数为n-1,不移动21212525494925*25*16160808while(m0)&(flag=1)flag=0;for(j=1;jL.rj+1.key)flag=1;x=L.rj;L.rj=L.rj+1;L.rj+1=x;最好情况下:
21212525494925*25*16160808算法分析u时间复杂度为o(n2)需n-1趟排序,第i趟比较n-i次,移动3(n-i)次最坏情况下:
u空间复杂度为o
(1)u是一种稳定的排序方法快速排序基本思想:
任取一个元素(如第一个)为中心所有比它小的元素一律前放,比它大的元素一律后放,形成左右两个子表;对各子表重新选择中心元素并依此规则调整,直到每个子表的元素只剩一个21212525494925*25*16160808012345212125*25*16162525161608084949pivotkey08082121pivotkeypivotkey快速排序25*25*2525494949490808161625*25*25252121快速排序0808161625*25*212125254949pivotkey012345678493838656597977676131327274949highlow49界点快速排序快速排序012345678493838656597977676131327274949highlow49界点快速排序012345678493838656597977676131327274949highlow49界点012345678493838656597977676131327274949highlow49界点快速排序快速排序012345678493838656597977676131327274949highlow49界点快速排序012345678493838656597977676131327274949highlow49界点快速排序012345678493838656597977676131327274949highlow49界点快速排序012345678493838656597977676131327274949highlow49界点快速排序012345678493838656597977676131327274949highlow49界点快速排序012345678493838656597977676131327274949highlow49界点快速排序012345678493838656597977676131327274949highlow49界点快速排序012345678493838656597977676131327274949highlow49界点快速排序012345678493838656597977676131327274949highlow49界点快速排序012345678493838656597977676131327274949highlow49界点快速排序012345678493838656597977676131327274949highlow49界点快速排序012345678493838656597977676131327274949highlow49界点快速排序012345678493838656597977676131327274949highlow49界点快速排序012345678493838656597977676131327274949highlow49界点快速排序012345678493838656597977676131327274949highlow49界点快速排序012345678493838656597977676131327274949highlow49界点快速排序012345678493838656597977676131327274949highlow49界点快速排序012345678493838656597977676131327274949highlow49界点快速排序012345678493838656597977676131327274949highlow49界点快速排序012345678493838656597977676131327274949highlow49界点快速排序012345678493838656597977676131327274949highlow49界点快速排序012345678493838656597977676131327274949highlow49界点快速排序012345678493838656597977676131327274949highlow49界点快速排序012345678493838656597977676131327274949highlow49界点快速排序012345678493838656597977676131327274949highlow49界点快速排序A每一趟的子表的形成是采用从两头向中间交替式逼近法;B由于每趟中对各子表的操作都相似,可采用递归算法。
voidmain()QSort(L,1,L.length);voidQSort(SqList&L,intlow,inthigh)if(lowhigh)pivotloc=Partition(L,low,high);Qsort(L,low,pivotloc-1);Qsort(L,pivotloc+1,high)快速排序intPartition(SqList&L,intlow,inthigh)L.r0=L.rlow;pivotkey=L.rlow.key;while(lowhigh)while(low=pivotkey)-high;L.rlow=L.rhigh;while(lowhigh&L.rlow.key=pivotkey)+low;L.rhigh=L.rlow;L.rlow=L.r0;returnlow;快速排序可以证明,平均计算时间是O(nlog2n)。
算法分析实验结果表明:
就平均计算时间而言,快速排序是我们所讨论的所有内排序方法中最好的一个。
快速排序是递归的,需要有一个栈存放每层递归调用时参数(新的low和high)。
最大递归调用层次数与递归树的深度一致,因此,要求存储开销为O(log2n)。
算法分析最坏从小到大排好序,递归树成为单支树,每次划分只得到一个比上一次少一个对象的子序列,必须经过n-1趟才能把所有对象定位,而且第i趟需要经过n-i次关键码比较才能找到第i个对象的安放位置。
最好划分后,左侧右侧子序列的长度相同算法分析时间效率:
O(nlog2n)每趟确定的元素呈指数增加123稳定性:
不稳定可选任一元素为支点。
空间效率:
O(log2n)递归要用到栈空间目录导航8.18.28.38.48.58.68.7概述插入排序交换排序选择排序归并排序基数排序外部排序Contents选择排序基本思想:
每一趟在后面n-i+1个中选出关键码最小的对象,作为有序序列的第i个记录2125*i=125164908最小者08交换21,0825160825*4921i=2最小者16交换25,1649i=3081625*2521最小者21交换49,21简单选择排序4925*25*25*25*012345i=408162521最小者25*无交换25*i=549最小者25无交换2521160825160825*4921结果各趟排序后的结果简单选择排序voidSelectSort(SqList&K)for(i=1;iL.length;+i)/在L.ri.L.length中选择key最小的记录k=i;for(j=i+1;j=L.length;j+)if(L.rj.keyL.rk.key)k=j;if(k!
=i)L.riL.rk;简单选择排序算法分析时间复杂度:
O(n)空间复杂度:
O
(1)稳定比较次数:
移动次数最好情况:
0最坏情况:
3(n-1)BAOBAODIAOCHABAODIAOWANGZHAOCHALIUBAODIAOYANGXUEWANG树形选择排序DIAOCHADIAOWANGZHAOCHALIUDIAOYANGXUEWANG树形选择排序CHACHADIAOCHALIUDIAOWANGZHAOCHALIU*DIAOYANGXUEWANG树形选择排序DIAOLIUDIAOWANGZHAOLIU*DIAOYANGXUEWANG树形选择排序BIAOLIUDIAOZHAOLIUDIAOWANGZHAO*LIU*DIAOYANGXUEWANG树形选择排序改进:
简单选择排序没有利用上次选择的结果,是造成速度慢的重要原因。
如果,能够加以改进,将会提高排序的速度。
381376276549974938651327133813选出最小者13树形选择排序改进:
简单选择排序没有利用上次选择的结果,是造成速度满的重要原因。
如果,能够加以改进,将会提高排序的速度。
381376276549974938651327133813选出次最小者,应利用上次比较的结果。
从被13打败的结点27、76、38中加以确定。
树形选择排序改进:
简单选择排序没有利用上次选择的结果,是造成速度满的重要原因。
如果,能够加以改进,将会提高排序的速度。
381376276549974938651327133813选出次最小者,应利用上次比较的结果。
从被13打败的结点27、76、38中加以确定。
树形选择排序n个元素的序列k1,k2,kn,当且仅当满足下列关系时,成为堆:
堆排序什么是堆?
如果将序列看成一个完全二叉树,非终端结点的值均小于或大于左右子结点的值。
(87,78,53,45,65,09,31,17,23)(09,17,65,23,45,78,87,53,31)利用树的结构特征来描述堆,所以树只是作为堆的描述工具,堆实际是存放在线形空间中的。
堆排序堆顶元素(根)为最小值或最大值小根堆8169162111054大根堆16812916211514堆排序81691062111541981061621154堆排序判定(80,75,40,62,73,35,28,50,38,25,47,15)是否为堆807540627328355038254715完全二叉树大根堆堆排序将无序序列建成一个堆输出堆顶的最小(大)值使剩余的n-1个元素又调整成一个堆,则可得到n个元素的次小值重复执行,得到一个有序序列基本思想:
如何建?
如何调整?
堆排序3016024047058312610712345673060840701210如何将无序序列建成堆思考:
有n个结点的完全二叉树,最后一个分支结点的标号是多少?
n/212345677060124030810从第n/2个元素起,至第一个元素止,进行反复筛选堆堆排序7016024043051238610712345673060840701210无序序列建成堆13016024047053610781212345673060124070810无序序列建成堆13016024047053610712830124045123861076012345673060124070810无序序列建成堆27012345673070124060810无序序列建成堆23012404512386107706012345673070124060810无序序列建成堆31702404605123861073012345677030124
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 语言版 排序