资源预览内容
第1页 / 共41页
第2页 / 共41页
第3页 / 共41页
第4页 / 共41页
第5页 / 共41页
第6页 / 共41页
第7页 / 共41页
第8页 / 共41页
第9页 / 共41页
第10页 / 共41页
第11页 / 共41页
第12页 / 共41页
第13页 / 共41页
第14页 / 共41页
第15页 / 共41页
第16页 / 共41页
第17页 / 共41页
第18页 / 共41页
第19页 / 共41页
第20页 / 共41页
亲,该文档总共41页,到这儿已超出免费预览范围,如果喜欢就下载吧!
点击查看更多>>
资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第八章 排序,排序定义将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列叫,排序分类,按待排序记录所在位置,内部排序:待排序记录存放在内存,外部排序:排序过程中需对外存进行访问的排序,按排序依据原则,插入排序:直接插入排序、折半插入排序、希尔排序,交换排序:冒泡排序、快速排序,选择排序:简单选择排序、堆排序,归并排序:2-路归并排序,基数排序,按排序所需工作量,简单的排序方法:,T(n)=O(n),先进的排序方法:,T(n)=O(,logn,),基数排序:,T(n)=O(d.n),排序基本操作,比较两个关键字大小,将记录从一个位置移动到另一个位置,8.1 插入排序,直接插入排序,排序过程:整个排序过程为,n-1,趟插入,即先将序列中第1个记录看成是一个有序子序列,然后从第2个记录开始,逐个进行插入,直至整个序列有序,算法描述,例,49 38 65 97 76 13 27,i=2,38,(38 49)65 97 76 13 27,i=3,65,(38 49 65)97 76 13 27,i=4,97,(38 49 65 97)76 13 27,i=5,76,(38 49 65 76 97)13 27,i=6,13,(13 38 49 65 76 97)27,i=1 (,),i=7,(13 38 49 65 76 97)27,27,j,j,j,j,j,j,97,76,65,49,38,27,(13 27 38 49 65 76 97),排序结果:,算法评价,时间复杂度,若待排序记录按关键字从小到大排列(正序,),关键字比较次数:,记录移动次数:,若待排序记录按关键字从大到小排列(逆序),关键字比较次数:,记录移动次数:,若待排序记录是随机的,取平均值,关键字比较次数:,记录移动次数:,T(n)=O(n),空间复杂度:,S(n)=O(1),Ch8_1.c,折半插入排序,排序过程:用折半查找方法确定插入位置的排序叫,例,i=1,(30)13 70 85 39 42 6 20,i=2,13,(13 30),70 85 39 42 6 20,i=7,6,(6 13 30 39,42 70 85)20,.,i=8,20,(6 13 30 39,42 70 85)20,s,j,m,i=8,20,(6 13 30 39,42 70 85)20,s,j,m,i=8,20,(6 13 30 39,42 70 85)20,s,j,m,i=8,20,(6 13 30 39,42 70 85)20,s,j,i=8,20,(6 13 20 30 39,42 70 85),算法描述,算法评价,时间复杂度:,T(n)=O(n),空间复杂度:,S(n)=O(1),Ch8_2.c,希尔排序(缩小增量法),排序过程:先取一个正整数,d1n,,把所有相隔,d1,的记录放一组,组内进行直接插入排序;然后取,d2r2.key,,则交换;然后比较第二个记录与第三个记录;依次类推,直至第,n-1,个记录和第,n,个记录比较为止,第一趟冒泡排序,,结果关键字最大的记录被安置在最后一个记录上,对前,n-1,个记录进行第二趟冒泡排序,结果使关键字次大的记录被安置在第,n-1,个记录位置,重复上述过程,直到“在一趟排序过程中没有进行过交换记录的操作”为止,例,49 38 65 97 76 13 27 30,初始关键字,38 49 65 76 13 27 30,97,第一趟,38 49 65 13 27 30,76,第二趟,38 49 13 27 30,65,第三趟,38 13 27 30,49,第四趟,13 27 30,38,第五趟,13 27,30,第六趟,38,49,76,97,13,97,27,97,30,97,13,76,76,76,27,30,13,65,27,65,30,65,13,13,49,49,30,49,27,38,27,38,30,38,算法描述,算法评价,时间复杂度,最好情况(正序),比较次数:,n-1,移动次数:0,最坏情况(逆序),比较次数:,移动次数:,空间复杂度:,S(n)=O(1),T(n)=O(n),Ch8_4.c,快速排序,基本思想:通过一趟排序,将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录进行排序,以达到整个序列有序,排序过程:对,rst,中记录进行一趟快速排序,附设两个指针,i,和,j,,设枢轴记录,r,p,=rs,x=,r,p,.key,初始时令,i=s,j=t,首先从,j,所指位置向前搜索第一个关键字小于,x,的记录,并和,r,p,交换,再从,i,所指位置起向后搜索,找到第一个关键字大于,x,的记录,和,r,p,交换,重复上述两步,直至,i=j,为止,再分别对两个子序列进行快速排序,直到每个子序列只含有一个记录为止,例,初始关键字:,49,38 65 97 76 13 27 50,i,j,x,j,i,完成一趟排序:(27 38 13),49,(76 97 65 50),分别进行快速排序:(13),27 (,38),49,(50 65),76,(97),快速排序结束:13,27,38,49,50,65,76,97,49,27,i,j,i,j,i,j,49,65,j,i,13,49,i,j,49,97,i,j,算法描述,算法评价,时间复杂度,最好情况(每次总是选到中间值作枢轴),T(n)=O(nlog,2,n),最坏情况(每次总是选到最小或最大元素作枢轴),T(n)=O(n,),空间复杂度:需栈空间以实现递归,最坏情况:,S(n)=O(n),一般情况:,S(n)=O(log,2,n),T(n)=O(n),Ch8_5.c,8.3 选择排序,简单选择排序,排序过程,首先通过,n-1,次关键字比较,从,n,个记录中找出关键字最小的记录,将它与第一个记录交换,再通过,n-2,次比较,从剩余的,n-1,个记录中找出关键字次小的记录,将它与第二个记录交换,重复上述操作,共进行,n-1,趟排序后,排序结束,例,初始:49,38 65 97,76,13,27,k,j,j,j,j,j,j,k,k,i=1,13,49,一趟:,13,38,65 97,76,49,27,i=2,k,k,j,j,j,j,j,27,38,二趟:,13,27,65,97,76,49,38,三趟:,13,27,38,97,76,49,65,四趟:,13,27,38,49,76,97,65,五趟:,13,27,38,49,65,97,76,六趟:,13,27,38,49,65,76,97,排序结束:,13,27,38,49,65,76,97,算法描述,算法评价,时间复杂度,记录移动次数,最好情况:0,最坏情况:3(,n-1),比较次数:,空间复杂度:,S(n)=O(1),T(n)=O(n),Ch8_6.c,堆排序,堆的定义:,n,个元素的序列(,k1,k2,kn,),,当且仅当满足下列关系时,称之为堆,或,(,i=1,2,.,n/2),k,i,k,2i,k,i,k,2i,+1,k,i,k,2i,k,i,k,2i,+1,例 (96,83,27,38,11,9),例 (13,38,27,50,76,65,49,97),96,27,9,11,38,83,13,27,38,49,65,76,50,97,可将堆序列看成完全二叉树,则堆顶,元素(完全二叉树的根)必为序列中,n,个元素的最小值或最大值,堆排序:将无序序列建成一个堆,得到关键字最小(或最大)的记录;输出堆顶的最小(大)值后,使剩余的,n-1,个元素重又建成一个堆,则可得到,n,个元素的次小值;重复执行,得到一个有序序列,这个过程叫,堆排序需解决的两个问题:,如何由一个无序序列建成一个堆?,如何在输出堆顶元素之后,调整剩余元素,使之成为一个新的堆?,第二个问题解决方法筛选,方法:输出堆顶元素之后,以堆中最后一个元素替代之;然后将根结点值与左、右子树的根结点值进行比较,并与其中小者进行交换;重复上述操作,直至叶子结点,将得到新的堆,称这个从堆顶至叶子的调整过程为,“,筛选,”,例,13,27,38,49,65,76,50,97,97,27,38,49,65,76,50,13,输出:13,27,49,38,97,65,76,50,13,输出:13,97,49,38,27,65,76,50,13,输出:13 27,38,49,50,27,65,76,97,13,输出:13 27,65,49,50,27,38,76,97,13,输出:13 27 38,49,65,50,27,38,76,97,13,输出:13 27 38,76,65,50,27,38,49,97,13,输出:13 27 38 49,50,65,76,27,38,49,97,13,输出:13 27 38 49,97,65,76,27,38,49,50,13,输出:13 27 38 49 50,65,97,76,27,38,49,50,13,输出:13 27 38 49 50,97,65,76,27,38,49,50,13,输出:13 27 38 49 50 65,76,65,97,27,38,49,50,13,输出:13 27 38 49 50 65,97,65,76,27,38,49,50,13,输出:13 27 38 49 50 65 76,97,65,76,27,38,49,50,13,输出:13 27 38 49 50 65 76 97,算法描述,第一个问题解决方法,方法:从无序序列的第,n/2,个元素(即此无序序列对应的完全二叉树的最后一个非终端结点)起,至第一个元素止,进行反复筛选,例 含8个元素的无序序列(49,38,65,97,76,13,27,50),49,65,38,27,13,76,97,50,49,65,38,27,13,76,50,97,49,13,38,27,65,76,50,97,49,13,38,27,65,76,50,97,13,27,38,49,65,76,50,97,算法描述,算法评价,时间复杂度:最坏情况下,T(n)=O(,nlogn,),空间复杂度:,S(n)=O(1),Ch8_7.c,8.4 归并排序,归并将两个或两个以上的有序表组合成一个新的有序表,叫,2-路归并排序,排序过程,设初始序列含有,n,个记录,则可看成,n,个有序的子序列,每个子序列长度为1,两两合并,得到,n/2,个长度为2或1的有序子序列,再两两合并,如此重复,直至得到一个长度为,n,的有序序列为止,例,初始关键字:49 38 65 97 76 13 27,一趟归并后:38 49 65 97 13 76 27,二趟归并后:38 49 65 97 13 27 76,三趟归并后:13 27 38 49 65 76 97,算法描述,算法评价,时间复杂度:,T(n)=O(nlog,2,n),空间复杂度:,S(n)=O(n),Ch8_9.c,8.5 基数排序,多关键字排序,定义:,例 对52张扑克牌按以下次序排序:,23,A,2,3,A,2,3,A23A,两个关键字:花色(,),面值(23,A),并且,“,花色,”,地位高于,“,面值,”,多关键字排序方法,最高位优先法(,MSD):,先对最高位关键字,k1(,如花色)排序,将序列分成若干子序列,每个子序列有相同的,k1,值;然后让每个子序列对次关键字,k2(,如面值)排序,又分成若干更小的子序列;依次重复,直至就每个子序列对最低位关键字,kd,排序;最后将所有子序列依次连接在一起成为一个有序序列,最低位优先法(,LSD):,从最低位关键字,kd,起进行排序,然后再对高一位的关键字排序,依次重复,直至对最高位关键字,k1,排序后,便成为一个有序序列,MSD,与,LSD,不同特点,按,MSD,排序,必须将序列逐层分割成若干子序列,然后对各子序列分别排序,按,
点击显示更多内容>>

最新DOC

最新PPT

最新RAR

收藏 下载该资源
网站客服QQ:3392350380
装配图网版权所有
苏ICP备12009002号-6