数据结构(C语言版)第8章-排序课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《数据结构(C语言版)第8章-排序课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 语言版 排序 课件
- 资源描述:
-
1、排序第8章数据结构(C语言版)数据结构逻辑结构线性结构(线性表、栈、队、串、数组)非线性结构树结构图结构物理(存储结构)顺序结构链式结构数据运算插入运算删除运算修改运算查找运算排序运算掌握排序的基本概念和各种排序方法的特点,并能加以灵活应用熟练掌握直接插入排序、折半插入排序、起泡排序、直接选择排序、快速排序的排序算法及其性能分析掌握希尔排序、归并排序、堆排序、基数排序的方法及其性能分析掌握外部排序方法中败者树的建立及归并方法,掌握置换-选择排序的过程和最佳归并树的构造方法。01OPTION02OPTION03OPTION04OPTIONtarget目标目 录 导 航8.18.28.38.48.
2、58.68.7概述插入排序交换排序选择排序归并排序基数排序外部排序Contents1.什么是排序?将一组杂乱无章的数据按一定规律顺次排列起来。2.排序的目的是什么?存放在数据表中按关键字排序 便于查找!概述3.什么叫内部排序?什么叫外部排序?若待排序记录都在内存中,称为内部排序;若待排序记录一部分在内存,一部分在外存,则称为外部排序。注:外部排序时,要将数据分批调入内存来排序,中间结果还要及时放入外存,显然外部排序要复杂得多。概述4.排序算法的好坏如何衡量?概述空间效率占内存辅助空间的大小稳定性A和B的关键字相等,排序后A、B的先后次序保持不变,则称这种排序算法是稳定的。时间效率排序速度(比较
3、次数与移动次数)记录序列以顺序表存储Typedef struct /定义每个记录(数据元素)的结构 KeyType key;/关键字 InfoType otherinfo;/其它数据项RedType;Typedef struct /定义顺序表的结构 RedType r MAXSIZE+1;/存储顺序表的向量/r0一般作哨兵或缓冲区 int length;/顺序表的长度SqList;#define MAXSIZE 20 /设记录不超过20个typedef int KeyType;/设关键字为整型量(int型)排序算法分类规则不同插入排序交换排序选择排序归并排序时间复杂度不同简单排序O(n2)先进
4、排序O(nlog2n)目 录 导 航8.18.28.38.48.58.68.7概述插入排序交换排序选择排序归并排序基数排序外部排序Contents插入排序基本思想:即边插入边排序,保证子序列中随时都是排好序的 每步将一个待排序的对象,按其关键码大小,插入到前面已经排好序的一组对象的适当位置上,直到对象全部插入为止。直接插入排序(基于顺序查找)不同的具体实现方法导致不同的算法描述折半插入排序(基于折半查找)希尔排序(基于逐趟缩小增量)最简单的排序法!插入排序直接插入排序排序过程:整个排序过程为n-1趟插入,即先将序列中第1个记录看成是一个有序子序列,然后从第2个记录开始,逐个进行插入,直至整个序
5、列有序。【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)0 1 2 3 4 5 6i=2i=3i=5i=4i=6252525494949252525*16161608080808初态:完成!将序列存入顺序表L中,将L.r0作为哨兵(21,25,49,25*,16,08
6、)*表示后一个25直接插入排序有序序列R1.i-1Ri 无序序列 Ri.n插入排序的基本思想:有序序列R1.i无序序列 Ri+1.n插入排序的基本步骤:在R1.i-1中查找Ri的插入位置,R1.j.key Ri.key Rj+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插入位置直接插入排
7、序关键字大于Ri.key的记录向后移动循环结束表明Ri的插入位置为 j+1L.rj+1=L.r0;/插入到正确位置直接插入排序void InsertSort(SqList L)int i,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趟 比较次数和移动次数与初始排列有关最好情况下:每趟只需比较
8、 1 次,不移动 总比较次数为 n-1for(i=2;i=L.length;+i)if(L.ri.keyL.ri-1.key)最坏情况下:第 i 趟比较i次,移动i+1次算法分析2)1)(2(2nnini比较次数:2)1)(4()1(2nnini移动次数: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)是一种稳定的排序方法0 1 2 3 4 5算法分析折
9、半插入排序直接插入排序 减少关键字间的比较次数在插入 ri 时,利用折半查找法寻找 ri 的插入位置算法分析212549251608lowhighi=2折半插入排序212549251608lowhighmi=3折半插入排序212549251608lowhighm212549251608low/mhighi=4折半插入排序212549251608lowhighm212549251608low/mhighi=5折半插入排序212549251608lowhighm212549251608lowhighmi=6折半插入排序2 12 54 92 51 60 8void BInsertSort(SqLis
10、t&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 较大时,总关键码比较次数比直接插入排序的最
11、坏情况要好得多,但比其最好情况要差在对象的初始排列已经按关键码排好序或接近有序时,直接插入排序比折半插入排序执行的关键码比较次数要少折半插入排序的对象移动次数与直接插入排序相同,依赖于对象的初始排列 减少了比较次数,但没有减少移动次数 平均性能优于直接插入排序算法分析空间复杂度为 o(1)是一种稳定的排序方法时间复杂度为 o(n2)希尔排序算法思想的出发点:直接插入排序在基本有序时,效率较高在待排序的记录个数较少时,效率较高基本思想:先将整个待排记录序列分割成若干子序列,分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。希尔排序子序列的构成不是简单地“逐
12、段分割”将相隔某个增量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*975576042738 65 49*9755135576045513270427044949*4949*763876 65 65 9797551327044949*
13、3876 65 9713 27 0449*76 97 ri dk 值较大,子序列中对象较少,速度较快;dk 值逐渐变小,子序列中对象变多,但大多数对象已基本有序,所以排序速度仍然很快。希尔排序void ShellSort(SqList&L,int dlta,int t)/按增量序列dlta0t-1对顺序表L作Shell排序 for(k=0;kt;+k)ShellInsert(L,dltak);/增量为dltak的一趟插入排序 /ShellSort希尔排序算法(主程序)dk值依次装在dltat中void ShellInsert(SqList&L,int dk)for(i=dk+1;i=L.len
14、gth;+i)if(ri.key 0&(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
15、概述插入排序交换排序选择排序归并排序基数排序外部排序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起泡排序 优点:每趟结束时,不仅能挤出一个最大值到最后面位置,还能同时部分理顺其他元素;一旦下趟没有交换,还可提前结束排序void
16、main()int a11;/*a0不用,之用a1a10*/int i,j,t;printf(nInput 10 numbers: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;/交换 /endif m-;/endwhile 起泡排序算法分析 设对象个数为n 比较次数和移动次数与初始排列有关只
17、需 1趟排序,比较次数为 n-1,不移动 while(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;最好情况下:算法分析u时间复杂度为 o(n2)(21)(211nninni)(23)(321nninni需 n-1趟排序,第i趟比较n-i次,移动3(n-i)次最坏情况下:u空间复杂度为 o(1)u是一种稳定的排序方法快速排序基本思想:任取一个元素(如第一个)为中心所有比它小的元素一律前放,比它大的元素一律后放,形成左右两个子表;对各子表重新选择中心元素并依此规则调整,直到每个子表的元素只剩一个
18、0 1 2 3 4 5pivotkeypivotkeypivotkey快速排序快速排序pivotkey 0 1 2 3 4 5 6 7 8493838656597977676131327274949highlow49界点快速排序快速排序 0 1 2 3 4 5 6 7 8493838656597977676131327274949highlow49界点快速排序 0 1 2 3 4 5 6 7 8493838656597977676131327274949highlow49界点 0 1 2 3 4 5 6 7 8493838656597977676131327274949highlow49界点快
19、速排序快速排序 0 1 2 3 4 5 6 7 8493838656597977676131327274949highlow49界点快速排序 0 1 2 3 4 5 6 7 8493838656597977676131327274949highlow49界点快速排序 0 1 2 3 4 5 6 7 8493838656597977676131327274949highlow49界点快速排序 0 1 2 3 4 5 6 7 8493838656597977676131327274949highlow49界点快速排序 0 1 2 3 4 5 6 7 849383865659797767613132
20、7274949highlow49界点快速排序 0 1 2 3 4 5 6 7 8493838656597977676131327274949highlow49界点快速排序 0 1 2 3 4 5 6 7 8493838656597977676131327274949highlow49界点快速排序 0 1 2 3 4 5 6 7 8493838656597977676131327274949highlow49界点快速排序 0 1 2 3 4 5 6 7 8493838656597977676131327274949highlow49界点快速排序 0 1 2 3 4 5 6 7 849383865
21、6597977676131327274949highlow49界点快速排序 0 1 2 3 4 5 6 7 8493838656597977676131327274949highlow49界点快速排序 0 1 2 3 4 5 6 7 8493838656597977676131327274949highlow49界点快速排序 0 1 2 3 4 5 6 7 8493838656597977676131327274949highlow49界点快速排序 0 1 2 3 4 5 6 7 8493838656597977676131327274949highlow49界点快速排序 0 1 2 3 4
22、5 6 7 8493838656597977676131327274949highlow49界点快速排序 0 1 2 3 4 5 6 7 8493838656597977676131327274949highlow49界点快速排序 0 1 2 3 4 5 6 7 8493838656597977676131327274949highlow49界点快速排序 0 1 2 3 4 5 6 7 8493838656597977676131327274949highlow49界点快速排序 0 1 2 3 4 5 6 7 8493838656597977676131327274949highlow49界点
23、快速排序 0 1 2 3 4 5 6 7 8493838656597977676131327274949highlow49界点快速排序 0 1 2 3 4 5 6 7 8493838656597977676131327274949highlow49界点快速排序 0 1 2 3 4 5 6 7 8493838656597977676131327274949highlow49界点快速排序 0 1 2 3 4 5 6 7 8493838656597977676131327274949highlow49界点快速排序 0 1 2 3 4 5 6 7 849383865659797767613132727
24、4949highlow49界点快速排序 0 1 2 3 4 5 6 7 8493838656597977676131327274949highlow49界点快速排序A每一趟的子表的形成是采用从两头向中间交替式逼近法;B由于每趟中对各子表的操作都相似,可采用递归算法。void main()QSort(L,1,L.length);void QSort(SqList&L,int low,int high)if (low high)pivotloc=Partition(L,low,high);Qsort(L,low,pivotloc-1);Qsort(L,pivotloc+1,high)快速排序int
25、 Partition(SqList&L,int low,int high)L.r0=L.rlow;pivotkey=L.rlow.key;while (low high)while(low=pivotkey)-high;L.rlow=L.rhigh;while(low high&L.rlow.key=pivotkey)+low;L.rhigh=L.rlow;L.rlow=L.r0;return low;快速排序可以证明,平均计算时间是O(nlog2n)。算法分析实验结果表明:就平均计算时间而言,快速排序是我们所讨论的所有内排序方法中最好的一个。快速排序是递归的,需要有一个栈存放每层递归调用时参
展开阅读全文