归并排序所需辅助空间最多.PPT

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

四、关于“排序方法的时间复杂度的下限” 本章讨论的各种排序方法,除基数排序外,其它方法都是基于“比较关键字”进行排序的排序方法。 可以证明, 这类排序法可能达到的最快的时间复杂度为O(nlogn)。 (基数排序不是基于“比较关键字”的排序方法,所以它不受这个限制。) 例如:对三个关键字进行排序的判定树如下: K1K3 K1K2 K1K3 K2K3 K2 K3 K2K1K3 K1K2K3 K3K2K1 K2K3K1 K3K1K2 K1K3K2 1.树上的每一次“比较”都是必要的; 2.树上的叶子结点包含所有可能情况。 一般情况下,对n个关键字进行排序,可能得到的结果有n! 种,由于含n! 个叶子结点的二叉树的深度不小于?log2(n!)? +1, 则对 n 个关键字进行排序的比较次数至少是 ?log2(n!)? ? nlog2n (斯蒂林近似公式)。 所以,基于“比较关键字”进行排序的 排序方法,可能达到的最快的时间复杂度为 O(nlogn)。 例如,对任意的7个关键字进行基于比较的排序,至少要进行 次关键字之间的两两比较。 A.13 B.14 C.15 D.16 解:基于“比较”进行排序的算法在最坏情况下所需进行的比较次数至少为?log2(n!)?。?log2(7!)?=13。本题答案为A。 排序方法 时间复杂度 空间复杂度 稳定性 复杂性 平均情况 最坏情况 最好情况 直接插入排序 O(n2) O(n2) O(n) O(1) 稳定 简单 希尔排序 O(n1.3) ? ? O(1) 不稳定 较复杂 冒泡排序 O(n2) O(n2) O(n) O(1) 稳定 简单 快速排序 O(nlog2n) O(n2) O(nlog2n) O(log2n) 不稳定 较复杂 直接选择排序 O(n2) O(n2) O(n2) O(1) 不稳定 简单 堆排序 O(nlog2n) O(nlog2n) O(nlog2n) O(1) 不稳定 较复杂 归并排序 O(nlog2n) O(nlog2n) O(nlog2n) O(n) 稳定 较复杂 基数排序 O(d(n+r)) O(d(n+r)) O(d(n+r)) O(r) 稳定 较复杂 练习题10 10.2、10.4和10.6 练习题10 10.2、10.4和10.6 10.2 如果只想在一个有n个元素的任意序列中得到其中最小的第k(kn)个元素之前的部分排序序列,那么最好采用什么排序方法?为什么?例如有这样一个序列:{57,40,38,11,13,34,48,75,6,19,9,7},要得到其第4个元素之前的部分有序序列,用所选择的算法实现时,要执行多少次比较? 答:采用堆排序最合适,建立初始堆(小根堆)所花时间不超过4n,每次选出一个最小元素所花时间为log2n,因此得到第k个最小元素之前的部分序列所花时间大约为4n+klog2n,而冒泡排序和简单选择排序所花时间为kn。 对于序列{57,40,38,11,13,34,48,75,6,19,9,7},形成初始堆(小根堆)并选最小数据6,需进行18次数据比较;选次小数据7时,需进行5次数据比较;再选数据9时,需进行6次数据比较;选数据11时,需进行4次数据比较,总共需进行33次关键字比较。整个过程如图10.1所示。 10.4 给定n个记录的有序表A[0..n-1]和m个记录的有序表B[0..m-1],将它们归并为一个有序表,存放到C[0..m+n-1]中,试写出这一算法。 void Merge(RecType A[],int n,RecType B[],int m,RecType C[]) { int i,j,k=0; while (in jm) { if (A[i]B[j]) { C[k]=A[i]; k++;i++; } else if (A[i]B[j]) { C[k]=B[j]; k++;j++; } else //A[i]=B[j] { C[k]=A[i]; k++;i++; C[k]=B[j]; k++;j++; } } while (in) { C[k]=A[i]; k++;i++; } while (jm) { C[k]=B[j]; k++;j++; } } 10.6 设n

文档评论(0)

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

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

1亿VIP精品文档

相关文档