- 1、本文档共55页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
《計算机算法设计与分析导论》课后习题答案
4.1:在我们所了解的早期排序算法之中有一种叫做Maxsort的算法。它的工作流程如下:首先在未排序序列(初始时为整个序列)中选择其中最大的元素max,然后将该元素同未排序序列中的最后一个元素交换。这时,max元素就包含在由每次的最大元素组成的已排序序列之中了,也就说这时的max已经不在未排序序列之中了。重复上述过程直到完成整个序列的排序。
(a) 写出Maxsort算法。其中待排序序列为E,含有n个元素,脚标为范围为。
void Maxsort(Element[] E) {
int maxID = 0;
for (int i=E.length; i1; i--) {
for (int j=0; ji; j++) {
if (E[j] E[maxID]) maxID = k;
}
E[i] -- E[maxID];
}
}
(b) 说明在最坏情况下和平均情况下上述算法的比较次数。
最坏情况同平均情况是相同的都是。
4.2:在以下的几个练习中我们研究一种叫做“冒泡排序”的排序算法。该算法通过连续几遍浏览序列实现。排序策略是顺序比较相邻元素,如果这两个元素未排序则交换这两个元素的位置。也就说,首先比较第一个元素和第二个元素,如果第一个元素大于第二个元素,这交换这两个元素的位置;然后比较第二个元素与第三个元素,按照需要交换两个元素的位置;以此类推。
(a)
起泡排序的最坏情况为逆序输入,比较次数为。(b) 最好情况为已排序,需要(n-1)次比较。
4.3:
(a)
归纳法:当n=1时显然成立,当n=2时经过一次起泡后,也显然最大元素位于末尾;现假设当n=k-1是,命题也成立,则当n=k时,对前k-1个元素经过一次起泡后,根据假设显然第k-1个元素是前k-1个元素中最大的,现在根据起泡定义它要同第k个元素进行比较,当k元素大于k-1元素时,它为k个元素中最大的,命题成立;当k元素小于k-1元素时,它要同k-1交换,这时处于队列末尾的显然时队列中最大的元素。综上所述,当n=k时命题成立。(b)反正法:假设当没有一对相邻的元素需要交换位置的时候,得到的序列是未排序的,则该未排序队列至少存在一对元素是逆序的,现设这两个元素未E(I)和E(i+k),其中E(i)E(i+k)。而根据没有一对相邻元素需要交换位置的条件,又有E(i+k)E(i+k-1)……E(i+1)E(i),这是矛盾的。
4.4:
(a)证明:根据4.3(a)j+1处交换后,j+1元素是前j+1个元素中最大的。又因为在j+1到n-1之间没有再发生交换,即说明E(j+1)E(j+2)……E(n-2)E(n-1)。综上所述,从j+1位置到n-1位置都已经放置了最终排序结果的元素。
(b)
void bubbleSort(Element[] E, int n) {
int numPairs;
int last;
int j;
last = n - 1;
while(last0) {
numPairs = last;
last = -1;
for(int j=0; jnumPairs; j++) {
if(E[j]E[j+1]) {
Interchange E[j] and E[j+1];
last = j;
}
}
}
return;
}
(c) 这种改进对最坏情况并没有什么改进,因为在最坏情况(倒序)时,还时从n-1到1的每个过程都循环一遍。
4.5
不可以。正如同前面练习中所说的那样,已经排序的并不一定在“正确的位置之上”,这也许就是所说的“小局部,大局观”吧。简单的说明可以时,每一次向后的移动都是针对当前最大值的,也就是说最大值的移动是一移到底的,而同时相对小值的移动每次最多是一步。所以说即使是局部已经排序了,但是相对于“正确”排序的位置还是有差距的。
4.6
1,n,n-1,…,2 和 n,n-1,…,3,1,2 说明:将1放在n~2的逆序中任何位置都不改变最坏情况。
4.7
插入排序的最佳情况是序列已排序,这时候需要比较次数为n-1次,移动次数为0次。
4.8
(a) 最坏情况为插入位置在正数第2个位置,或者倒数第2个位置,比较次数[i/2]。在采用折半查找的时候,会设定已排序序列的首尾指针和当前指针,这样只有在第2个位置的元素进行最后的比较。
(b) 在最坏情况下插入位置在第1个位置上,移动次数为i次。
(c) 由于折半插入排序只是减
文档评论(0)