ImageVerifierCode 换一换
格式:PPT , 页数:58 ,大小:2.18MB ,
资源ID:1069427      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/1069427.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构与算法教学课件ppt作者王曙燕chapter9排序.ppt)为本站会员(b****1)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构与算法教学课件ppt作者王曙燕chapter9排序.ppt

1、1,9.1 概述,9.2 插入类排序,9.4 选择类排序,9.3 交换类排序,9.5 归并排序,9.6 分配类排序,9.7 外部排序,9.8 算法总结,2,排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列。,例如:将下列关键字序列,52,49,80,36,14,58,61,23,97,75,调整为,14,23,36,49,52,58,61,75,80,97,9.1 概述,3,排序的定义:假设含n个记录的序列为 a0,a1,,an-1 其相应的关键字序列为 K0,K1,,Kn-1,这些关键字相互之间可以进行比较,即在它们之间存在着这样一个关系:Kp0Kp

2、1Kpn-1,按此固有关系将上式记录序列重新排列为 ap0,ap1,,apn-1 的操作称作排序。,9.1 概述,4,排序,内部排序,外部排序,整个排序过程不需要访问外存便能完成。,若参加排序的记录数量很大,整个序列的排序过程不可能在内存中完成。,稳定排序,不稳定排序,排序,相同关键字的领先关系在排序过程中未发生变化。,相同关键字的领先关系在排序过程中发生变化。,9.1 概述,5,内部排序的过程:是一个逐步扩大记录的有序序列长度的过程。,经过一趟排序,有序序列区,无 序 序 列 区,有序序列区,无 序 序 列 区,内部排序的方法,9.1 概述,6,基于不同的“扩大”有序序列长度的方法,内部排序

3、方法大致可分下列几种类型:,插入类,交换类,选择类,归并类,其它方法,9.1 概述,7,待排记录的数据类型定义如下:,#define MAXSIZE 1000typedef int KeyType;typedef struct KeyType key;OtherType other_data;RecordType;typedef struct RcdType rMAXSIZE+1;int length;SqList;,9.1 概述,8,9.2 插入类排序,将无序子序列中的一个或几个记录“插入”到有序序列中,从而增加记录的有序子序列的长度。,有序序列a1.i-1,ai,无序序列 ai.n-1,一

4、趟直接插入排序的基本思想:,有序序列a1.i,无序序列 ai+1.n-1,9,9.2 插入类排序,实现“一趟插入排序”可分三步进行:,3将ai 插入(复制)到aj+1的位置上。,2将aj+1.i中的所有记录均后移一个位置;,1在a1.i-1中查找ai的插入位置,a1.j.key ai.key aj+1.i.key;,10,9.2 插入类排序,直接插入排序(基于顺序查找),希尔排序(基于逐趟缩小增量),不同的具体实现方法导致不同的算法描述,折半插入排序(基于折半查找),表插入排序(基于链表存储),11,9.2 插入类排序,直接插入排序,利用顺序查找实现在r1.i-1中查找ri的插入位置,48,6

5、2,35,77,55,14,35,98,第1 趟,48,62,r0,62,35,2,35,48,62,3,77,77,4,55,55,62,77,5,14,14,35,48,55,62,77,6,35,35,48,55,62,77,7,98,98,从ri-1起向前进行顺序查找,监视哨设置在r0;,r0=ri;,循环结束表明ri的插入位置为 j+1,r0,j,ri,for(j=i-1;r0.keyrj.key;-j);,j=i-1,插入位置,12,9.2 插入类排序,对于在查找过程中找到的那些关键字不小于ri.key的记录,并在查找的同时实现记录向后移动;,for(j=i-1;r0.keyrj.

6、key;-j);rj+1=rj;,上述循环结束后可以直接进行“插入”rj+1=r0;,直接插入排序,13,令 i=2,3,,n,实现整个序列的排序。,for(i=2;i=n;+i)if(ri.keyri-1.key)在 r1.i-1中查找ri的插入位置;插入ri;,9.2 插入类排序,直接插入排序,14,9.2 插入类排序,直接插入排序,void InsertionSort(SqList+i)if(L.ri.key L.ri-1.key),L.r0=L.ri;for(j=i-1;L.r0.key L.rj.key;-j)L.rj+1=L.rj;L.rj+1=L.r0;,时间复杂度:O(n2),

7、15,9.2 插入类排序,折半插入排序,因为 r1.i-1 是一个按关键字有序的有序序列,则可以利用折半查找实现“在r1.i-1中查找ri的插入位置”,如此实现的插入排序为折半插入排序。,i,low,high,m,high,m,high,m,low,例如:,插入位置,L.r,16,数 据 结 构,9.2 插入类排序,第 9 章 内部排序,折半插入排序,void BiInsertionSort(SqList&L),在 L.r1.i-1中折半查找插入位置;,for(i=2;i=L.length;+i),L.r0=L.ri;,for(j=i-1;j=low;-j)L.rj+1=L.rj;,L.rlo

8、w=L.r0;,17,9.2 插入类排序,折半插入排序,low=1;high=i-1;while(low=high),m=(low+high)/2;,if(L.r0.key L.rm.key)high=m-1;else low=m+1;,在 L.r1.i-1中折半查找插入位置;,18,9.2 插入类排序,希尔排序,基本思想:对待排记录序列先作“宏观”调整,再作“微观”调整。,所谓“宏观”调整,指的是,“跳跃式”的插入排序。,(又称缩小增量排序),19,将记录序列分成若干子序列,分别对每个子序列进行插入排序。,其中,d 称为增量,它的值在排序过程中从大到小逐渐缩小,直至最后一趟排序减为1。,例如

9、:将 n 个记录分成 d 个子序列:R1,R1+d,R1+2d,R1+kd R2,R2+d,R2+2d,R2+kd Rd,R2d,R3d,Rkd,R(k+1)d,9.2 插入类排序,希尔排序,(又称缩小增量排序),具体做法为:,20,9.2 插入类排序,希尔排序,(又称缩小增量排序),d1=4,17,55,05,13,d2=2,05,13,46,94,d3=1,13,17,70,94,21,9.2 插入类排序,希尔排序,(又称缩小增量排序),void ShellInsert(SqList,22,9.2 插入类排序,希尔排序,(又称缩小增量排序),void ShellSort(SqList,23

10、,9.3 交换类排序,基本思想:,通过交换逆序元素进行排序的方法。,冒泡排序(相邻比逆法),快速排序,通过“交换”无序序列中的记录从而得到其中关键字最小或最大的记录,并将它加入到有序子序列中,以此方法增加记录的有序子序列的长度。,24,9.3 交换类排序,冒泡排序(相邻比逆法),思想:在扫描的过程中顺次比较相邻的两个 元素的大小,若逆序就交换位置。,第1趟,35,62,55,77,14,77,35,77,22,98,40,98,9次,第2趟,77,35,48,55,14,35,62,22,40,8次,第n-1趟,排序结束,n-i次,第i 趟,25,9.3 交换类排序,冒泡排序(相邻比逆法),v

11、oid BubbleSort(RecordType r,int length)n=length;for(i=1;irj+1.key)x=aj;rj=rj+1;rj+1=x;,i+),change=1;,change=0;,change=1;,26,9.3 交换类排序,冒泡排序,时间分析:,27,9.3 交换类排序,快速排序,改进冒泡排序中一次交换只能消除一个逆序的缺点,即实现一次交换消除多个逆序。,思想:找一个记录,以它的关键字作为“枢轴”,凡其关键字小于枢轴的记录均移动至该记录之前,凡其关键字大于枢轴的记录均移动至该记录之后。即对无序的记录序列进行“一次划分”,,之后分别对分割所得两个子序列

12、“递归”进行快速排序。,28,9.3 交换类排序,快速排序,一次划分(一趟快速排序),r0,48,low,high,high,35,low,62,high,14,low,low,77,high,high,48,29,9.3 交换类排序,快速排序,int QKpass(RecordType r,int low,int high),r0=rlow;,while(lowhigh),while(low=r0.key)-high;,rlow=rhigh;,while(lowhigh,rhigh=rlow;,rlow=r0;return low;,一趟快速排序算法,30,void QKSort(Recor

13、dType r,int low,int high)r0=rlow;if(lowhigh)pos=QKpass(r,low,high);QKSort(r,low,pos-1);QkSort(r,pos+1,high);,9.3 交换类排序,快速排序,算法,31,9.3 交换类排序,快速排序,时间性能,假设一次划分所得枢轴位置 i=k,则对n 个记录进行快排所需时间:,其中 Tpass(n)为对 n 个记录进行一次划分所需时间。,若待排序列中记录的关键字是随机分布的,则 k 取 1 至 n 中任意一值的可能性相同。,T(n)=Tpass(n)+T(k-1)+T(n-k),设 Tavg(1)b,则可

14、得结果:,O(nlogn),由此可得快速排序所需时间的平均值为:,32,9.4 选择类排序,从记录的无序子序列中“选择”关键字最小或最大的记录,并将它加入到有序子序列中,以此方法增加记录的有序子序列的长度。,简单选择排序,堆排序,树型选择排序,33,9.4 选择类排序,简单选择排序,i,第 1 趟,k,j,j,k,j,j,j,k,j,j,14,48,2,i,k,j,35,62,3,35,62,4,48,77,5,55,6,62,77,7,77,8,98,void SelectSort(RecordType r,int n)n=length;for(i=1;i=n-1;i+)k=i;for(j=

15、i+1;j=n;+j)if(rj.keyrk.key)k=j;if(k!=i)x=ri;ri=rk;rk=x;,34,9.4 选择类排序,简单选择排序,时间性能分析,对 n 个记录进行简单选择排序,所需进行的关键字间的比较次数 总计为:,移动记录的次数,最小值为 0,最大值为3(n-1)。,35,9.4 选择类排序,树型选择排序,是一种按锦标赛的思想进行排序的方法。,49,38,27,65,97,76,49,13,38,65,13,27,38,13,13,76,13,27,27,27,49,49,38,38,49,49,49,49,65,49,49,76,65,65,97,97,76,76,9

16、7,97,36,9.4 选择类排序,堆排序,对树型排序的进一步改进。,堆是满足下列性质的数列r1,r2,,rn:,或,堆的定义:,12,36,27,65,40,34,98,81,73,55,49,例如:,是小顶堆,12,36,27,65,40,14,98,81,73,55,49,不是堆,(小顶堆),(大顶堆),37,ri,r2i,r2i+1,若将该数列视作完全二叉树,则 r2i 是 ri 的左孩子;r2i+1 是 ri 的右孩子。,例如:,9.4 选择类排序,堆排序,12,36,27,65,40,34,98,81,73,55,49,12,36,27,65,40,34,98,81,73,55,49,14,14,是小顶堆,不,38,堆排序即是利用堆的特性对记录序列进行排序。,例如:,建大顶堆,98,81,49,73,36,27,40,55,64,12,12,81,49,73,36,27,40,55,64,98,交换 98 和 12,重新调整为大顶堆,81,73,49,64,36,27,40,55,12,98,40,55,49,73,12,27,98,81,64,36,经过筛选,9.4 选择

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1