教案第8章 排序.pptVIP

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

将排序方法分为基于比较的排序和不基于比较的排序,其中,基于比较的排序方法的实现主要是通过关键码的比较和记录的移动这两种操作,并且其最好时间下限已经被证明为O(nlog2n) 内排序大致可分为插入排序、交换排序、选择排序、归并排序等四类;内排序还可分为两类:⑴简单的排序方法,其时间复杂度为O(n2);⑵先进的排序方法,其时间复杂度为O(nlog2n)。 直接插入排序过程示例 直接插入排序过程示例 希尔插入排序过程示例 需解决的关键问题 “自上而下”冒泡排序的算法分析 最好情况:初始数据排列已经有序(从小到大),只执行一趟冒泡,做 n-1 次数值比较,不需交换数据。 最坏情况:初始数据排列逆序(从大到小) ,算法要执行n-1趟冒泡,第i趟(1? i? n) 做了n- i 次数值比较,执行了n-i 次数据交换。此时序列的比较总次数和移动总次数为: 时间复杂度O(n) ·时间复杂度(最坏和平均情况下) ---O(n2) ·空间复杂度 (只用了一个缓存单元t做交换) ---O(1) ·稳定性 (前面例子27始终在27*的前面) ---稳定 8.3.2 快速排序 改进的着眼点是:在起泡排序中,记录的比较和移动是在相邻单元中进行的,记录每次交换只能上移或下移一个单元,因而总的比较次数和移动次数较多。 在快速排序中,记录的比较和移动是从两端向中间进行的,关键码较大的记录一次就能从前面移动到后面的单元,关键码较小的记录一次就能从后面移动到前面的单元,记录每次移动的距离较远,从而减少了总的比较次数和移动次数。 快速排序的基本思想 首先选一个轴值(即比较的基准),通过一趟排序将待排序记录分割成独立的两部分,前一部分记录的关键码均小于轴值,后一部分记录的关键码均大于或等于轴值,然后分别对这两部分重复上述方法,直到整个序列有序。 ⑴如何选择轴值? ⑵在每个子序列内如何实现快速排序(通常叫做一次划分)? ⑶如何处理分区得到的两个待排序子序列? ⑷如何判别快速排序的结束? 13 65 27 50 38 49 55 j i j j 13 65 27 50 38 49 55 j i i i 13 65 27 50 38 49 55 i j j j 一次划分示例 问题⑴的解决 选择轴值的方法: (1)使用第一个记录的关键码; (2)选取序列中间记录的关键码; (3)比较序列中第一个记录、最后一个记录和中间记录的关键码,取关键码居中的作为轴值并调换到第一个记录的位置; (4)随机选取轴值。 问题⑵的解决 设待划分的序列是r[s] ~ r[t],设参数i,j分别指向子序列左、右两端的下标s和t,令r[s]为轴值, (1)j从后向前扫描,直到r[j]r[i],将r[j]移动到r[i]的位置,使关键码小(同轴值相比)的记录移动到前面去; (2)i从前向后扫描,直到r[i]>r[j],将r[i]移动到r[j]的位置,使关键码大(同轴值比较)的记录移动到后面去; (3)重复上述过程,直到i=j,即指向同一位置。 整个快速排序的过程可递归进行。若待排序列中只有一个记录,显然已有序,否则进行一趟快速排序后,再分别对分割所得的两个子序列进行快速排序(即递归处理)。 问题⑶、⑷的解决 13 27 50 38 49 55 j i i j 13 65 27 50 38 49 55 快速排序的执行过程 65 void quickSort (int r[ ], int first, int end ) {//在序列 first~end中递归地进行快速排序 if ( first end) { pivotpos = partition (r, first, end ); quickSort (r, first, pivotpos-1); quickSort (r, pivotpos+1, end ); } } 快速排序算法 int partition (rectype r[ ], int s, int t) {//对无序区r[s]到r[t]进行一趟划分,函数返回划 //分后被定位的基准记录的位置 int i,j; rectype temp; i=s;j=t;temp=r[i]; do{ while ((r[j]=temp)(ij)) j--; if (ij) r[i++]=r[j]; while ((r[i]=temp)(ij)) i++; if (ij)

文档评论(0)

ranfand + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档