《数据结构》课件第9章 内部排序.ppt

《数据结构》课件第9章 内部排序.ppt

  1. 1、本文档共60页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

②对长度为n的记录序列进行快速排序时,所需进行的比较次数依赖于这n个元素的初始排列。分析其最坏与最好情况,对n=7给出一个最好情况的初始排列实例。解:快速排序算法是平均排序性能最好的算法之一。快速排序最坏情况是序列有序,每次以枢轴元素为界,序列分为两个子表,一个子表为空,另一个子表为n-1个元素,快速排序蜕变为冒泡排序。快速排序最好情况是这样的排列,每次的枢轴元素放置的位置在表中间,正好能够将序列分为两个长度相当的子表,此时快速排序性能类同折半判定树的分析。其趟数为log2n」+1。n=7时一个最好情况的初始排列实例为:[4,1,3,2,6,5,7]第一趟划分结果为:[2,1,3]4[6,5,7]第二趟划分结果为:[1],2,[3]4[5],6,[7]最终的排序结果为:1,2,3,4,5,6,7例2:荷兰国旗问题假设有一个仅由红、白、蓝三种颜色的条块组成的序列,需要在O(n)时间内将这些条块按红、白、蓝的顺序排好,即排成荷兰国旗图案。例如,给定彩色条块序列为:﹛蓝、白、红、白、蓝、红、白、白、红、蓝﹜则要求排列结果为:﹛红、红、红、白、白、白、白、蓝、蓝、蓝﹜【问题分析】这个问题实际上是一种排序的问题,它要按颜色值(红白蓝)的顺序对这些条块序列进行排序。如果用1、2、3分别代表红、白、蓝三种颜色,那么就可以直接使用比较运算符进行比较,利用本章的排序算法进行排序。但是一般的排序算法的时间复杂度都大于O(n),因此不能直接使用,必须加以改进。方法一:采用简单选择排序思想【算法思想】假设这些条块颜色依次存放在L[0..n-1]中,利用简单选择排序思想,首先从序列中选取所有的红色条块,依次放到序列的前面,然后再从剩余的序列中选取所有的白色条块,依次放到红色条块后面。这样经过两趟选择后,整个序列就按红、白、蓝有序。由于每一趟选择的时间复杂度为O(n),所以整个过程的时间复杂度也为O(n)。【算法描述】voidSort(intL[],intn)/*条块颜色依次存放在L[0..n-1]中,本算法利用简单选择排序思想,将整个序列按红、白、蓝进行排序。*/﹛inti,j,x;i=0;/*i指向第一个红色条块应该放的位置*/for(j=i;jn;j++)/*j扫描所有尚未放置好的条块,寻找红色条块*/if(L[j]==1)/*找到一个红色条块*/﹛if(j!=i)/*找到的红色条块不在下一个红色条块应该放的位置则换位*/{x=L[j];L[j]=L[i];L[i]=x;}i++;/*i指向下一个红色条块应该放的位置*/﹜/*退出前面循环后,i指向第一个白色条块应该放的位置*/for(j=i;jn;j++)/*j扫描所有尚未放置好的条块,寻找白色条块*/if(L[j]==2)/*找到一个白色条块*/﹛if(j!=i)/*找到的白色条块不在下一个白色条块应该放的位置则换位*/﹛x=L[j];L[j]=L[i];L[i]=x;﹜i++;/*i指向下一个白色条块应该放的位置*/﹜﹜方法二:采用快速排序思想【算法思想】上述算法思想比较简单,但使用了两个几乎完全一样的循环,使得算法显得过于冗长。下面利用快速排序中对序列进行划分的思想,这样用一个循环就可以了。具体方法是:设置3个整型变量r、w、b,其中r指向红色条块区的下一个单元,w指向白色条块区的下一个单元,b指向蓝色条块区的前一个单元。开始时令r和w为0,b为n-1。w相当于快速排序中的low指针,b相当于快速排序中的high指针。最终L[0..r-1]存放红色条块区,L[r..w-1]存放白色条块区,L[w..n-1]存放蓝色条块区。检查L[w]的值,有下列三种情况:(1)如果L[w]=2,则它已经在白色区末尾,w直接加1;(2)??(2)如果L[w]=3,在将它加到蓝色区头部,即L[w]与L[b]交换,且b减1;(3)(3)如果L[w]=1,此时先将白色区第一个元素(即红色区的下一个单元)移到白色区末尾,再将它加到红色区的下一个单元,即L[w]与L[r]交换,且r和w同时加1。重复这个过程,直到wb为止。【算法描述】

文档评论(0)

酱酱 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档