算法分析与设计-第05章.pptVIP

  1. 1、本文档共108页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

快速排序经过一趟分划,原序列被分成三部分:主元和左、右两个子序列:(Kp(0),Kp(1),...Kp(j-1))Kp(j)(Kp(j+1),Kp(j+2),Kp(n-1))通过分划操作,原序列的排序问题被分解成了两个性质相同、相互独立的子问题,分别对两个子序列进行排序。当子序列为空序列或只有一个元素的序列时,无须进行任何处理,它们自然是有序的。分划操作演示i向右扫描,寻找l[i]≥l[left]的元素j向左扫描,寻找l[j]≤l[left]的元素48687236481202leftrightij∞0123456736不大于等于主元,所以继续扫描找到大于主元的元素68,扫描暂停;准备和l[j]交换;left和right是待排序元素序列的下、上界;left和right是待排序元素序列的下、上界;()()此时,ij,扫描结束;把l[left]和l[j]交换,实现了各元素按“左边小右边大”的原则分布在主元两侧。如果ij,则交换l[i]和l[j],继续各自的扫描。其目的是把较主元小的元素放到左边,较主元大的元素放到右边;找到小于主元的元素02,准备和l[i]交换;接下来会分别把主元两侧的两个子序列作为排序对象递归执行快速排序算法(过程略)【程序5-11】分划函数templateclassTintSortableListT::Partition(intleft,intright){//前置条件:left?rightinti=left,j=right+1;do{doi++;while(l[i]l[left]);doj--;while(l[j]l[left]);if(ij)Swap(i,j);}while(ij);Swap(left,j);returnj;}快速排序算法初始序列:48366872124802第1趟:(12360248)48(7268)第2趟:(02)12(3648)48(7268)第3趟:021236(48)48(7268)第4趟:02123648486872【程序5-12】快速排序templateclassTvoidSortableListT::QuickSort(){QuickSort(0,n-1);}templateclassTvoidSortableListT::QuickSort(intleft,intright){if(leftright){intj=Partition(left,right);QuickSort(left,j-1);QuickSort(j+1,right);}}分划操作是快速排序的核心。分划操作中最简单的选择主元的方法:选择序列的第一个元素。程序5-11快速排序算法(分划函数—Partition)intPartition(intleft,intright){ //调用本函数的前置条件:leftright;主元为第一个元素l[left]。 inti=left,j=right+1; do{ doi++;while(l[i]l[left]); //从l[left+1]开始比较 //i右移,直到遇到一个不小于主元的元素停止 doj--;while(l[j]l[left]); //从l[right]开始比较 //j左移,直到遇到一个不大于主元的元素停止 if(ij)Swap(i,j); //交换l[i]和l[j]两个元素 }while(ij); //只要i仍小于j Swap(left,j); //最后将主元l[left]与l[j]交换,结束一趟分划操作 returnj; //返回当前主元的位置}初始序列{72,26,57,88,42,80,72,48,60,∞}{72,26,57,88,42,80,72,48,60,∞}i++;j--;{72,

您可能关注的文档

文档评论(0)

趁早学习 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档