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

上传人:b****1 文档编号:1069427 上传时间:2022-10-16 格式:PPT 页数:58 大小:2.18MB
下载 相关 举报
数据结构与算法教学课件ppt作者王曙燕chapter9排序.ppt_第1页
第1页 / 共58页
数据结构与算法教学课件ppt作者王曙燕chapter9排序.ppt_第2页
第2页 / 共58页
数据结构与算法教学课件ppt作者王曙燕chapter9排序.ppt_第3页
第3页 / 共58页
数据结构与算法教学课件ppt作者王曙燕chapter9排序.ppt_第4页
第4页 / 共58页
数据结构与算法教学课件ppt作者王曙燕chapter9排序.ppt_第5页
第5页 / 共58页
点击查看更多>>
下载资源
资源描述

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

《数据结构与算法教学课件ppt作者王曙燕chapter9排序.ppt》由会员分享,可在线阅读,更多相关《数据结构与算法教学课件ppt作者王曙燕chapter9排序.ppt(58页珍藏版)》请在冰豆网上搜索。

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

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,这些关键字相互之间可以进行比较,即在它们之间存在着这样一个关系:

Kp0Kp1Kpn-1,按此固有关系将上式记录序列重新排列为ap0,ap1,,apn-1的操作称作排序。

9.1概述,4,排序,内部排序,外部排序,整个排序过程不需要访问外存便能完成。

若参加排序的记录数量很大,整个序列的排序过程不可能在内存中完成。

稳定排序,不稳定排序,排序,相同关键字的领先关系在排序过程中未发生变化。

相同关键字的领先关系在排序过程中发生变化。

9.1概述,5,内部排序的过程:

是一个逐步扩大记录的有序序列长度的过程。

经过一趟排序,有序序列区,无序序列区,有序序列区,无序序列区,内部排序的方法,9.1概述,6,基于不同的“扩大”有序序列长度的方法,内部排序方法大致可分下列几种类型:

插入类,交换类,选择类,归并类,其它方法,9.1概述,7,待排记录的数据类型定义如下:

#defineMAXSIZE1000typedefintKeyType;typedefstructKeyTypekey;OtherTypeother_data;RecordType;typedefstructRcdTyperMAXSIZE+1;intlength;SqList;,9.1概述,8,9.2插入类排序,将无序子序列中的一个或几个记录“插入”到有序序列中,从而增加记录的有序子序列的长度。

有序序列a1.i-1,ai,无序序列ai.n-1,一趟直接插入排序的基本思想:

有序序列a1.i,无序序列ai+1.n-1,9,9.2插入类排序,实现“一趟插入排序”可分三步进行:

3将ai插入(复制)到aj+1的位置上。

2将aj+1.i中的所有记录均后移一个位置;,1在a1.i-1中查找ai的插入位置,a1.j.keyai.keyaj+1.i.key;,10,9.2插入类排序,直接插入排序(基于顺序查找),希尔排序(基于逐趟缩小增量),不同的具体实现方法导致不同的算法描述,折半插入排序(基于折半查找),表插入排序(基于链表存储),11,9.2插入类排序,直接插入排序,利用顺序查找实现在r1.i-1中查找ri的插入位置,48,62,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.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插入类排序,直接插入排序,voidInsertionSort(SqList+i)if(L.ri.keyL.ri-1.key),L.r0=L.ri;for(j=i-1;L.r0.keyL.rj.key;-j)L.rj+1=L.rj;L.rj+1=L.r0;,时间复杂度:

O(n2),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章内部排序,折半插入排序,voidBiInsertionSort(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.rlow=L.r0;,17,9.2插入类排序,折半插入排序,low=1;high=i-1;while(low=high),m=(low+high)/2;,if(L.r0.keyL.rm.key)high=m-1;elselow=m+1;,在L.r1.i-1中折半查找插入位置;,18,9.2插入类排序,希尔排序,基本思想:

对待排记录序列先作“宏观”调整,再作“微观”调整。

所谓“宏观”调整,指的是,“跳跃式”的插入排序。

(又称缩小增量排序),19,将记录序列分成若干子序列,分别对每个子序列进行插入排序。

其中,d称为增量,它的值在排序过程中从大到小逐渐缩小,直至最后一趟排序减为1。

例如:

将n个记录分成d个子序列:

R1,R1+d,R1+2d,R1+kdR2,R2+d,R2+2d,R2+kdRd,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插入类排序,希尔排序,(又称缩小增量排序),voidShellInsert(SqList,22,9.2插入类排序,希尔排序,(又称缩小增量排序),voidShellSort(SqList,23,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交换类排序,冒泡排序(相邻比逆法),voidBubbleSort(RecordTyper,intlength)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交换类排序,快速排序,改进冒泡排序中一次交换只能消除一个逆序的缺点,即实现一次交换消除多个逆序。

思想:

找一个记录,以它的关键字作为“枢轴”,凡其关键字小于枢轴的记录均移动至该记录之前,凡其关键字大于枢轴的记录均移动至该记录之后。

即对无序的记录序列进行“一次划分”,,之后分别对分割所得两个子序列“递归”进行快速排序。

28,9.3交换类排序,快速排序,一次划分(一趟快速排序),r0,48,low,high,high,35,low,62,high,14,low,low,77,high,high,48,29,9.3交换类排序,快速排序,intQKpass(RecordTyper,intlow,inthigh),r0=rlow;,while(lowhigh),while(low=r0.key)-high;,rlow=rhigh;,while(lowhigh,rhigh=rlow;,rlow=r0;returnlow;,一趟快速排序算法,30,voidQKSort(RecordTyper,intlow,inthigh)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,则可得结果:

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,voidSelectSort(RecordTyper,intn)n=length;for(i=1;i=n-1;i+)k=i;for(j=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,97,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