您的位置:首页 > 其它

算法导论 思考题 2-2

2016-04-16 20:44 323 查看

题目:

冒泡排序算法的正确性

解答:

a)还需要证明什么?

不等式证明了,终止条件也证明了,缺啥? 证明子数组是原数组的一部分,也就是说,A′[i]A'[i] i=1∼n i=1\sim n 可以构成原数组

b)对第2~4行的for循环给出一个准确的循环不变式,并证明该循环不变式是成立的

b问题就是证明每一趟的排序, 这种证明真是。。。要亲命了,证明:

循环不变式:每次迭代中,A[j]=min{A[k]:j≤k≤n}A[ j ] = min \{A[k] : j ≤ k ≤ n \},并且子数组是原数组的一部分

初始化: 开始时,j=nj=n,A[j..n]A[ j . . n]中只有 A[n]A
一个元素,显然成立

保持: A[j]A[ j ]是A[j..n]A[ j . . n]中的最小值,那么,由if判断语句我们会发现,A[j−1]大于A[j]A[ j − 1]大于A[ j ],所以肯定会交换,这样以来A[j]A[ j ] 就是 A[j−1..n]A[ j − 1 . . n] 中的最小值,由此下去,我们就会正确的把后一部分的最小值移动到前面已经排好的子序列里面,加上前面排好的A[1..i+1]A[ 1 . . i+1] 是原数组的子数组,后面未排序的A[i+2..n]A[ i+2 . . n]也是原数组的子数组,不变式成立

终止: 终止时i=n,j=ni=n,j=n,如果排序完成A[j]=min{A[k]:j≤k≤n}A[ j ] = min \{A[k] : j ≤ k ≤ n \} 显然成立,因为A[j..n]A[ j . . n]中只有A[n]A

c) 给出一个循环不变式,并且用它来证明 公式2.3(A′[1]≤A′[2]≤A′[3]≤...A′[n]A'[1]≤A'[2]≤A'[3]≤...A'


循环不变式:子数组A[1..i−1]A[1 . . i −1]里是原始数组中前i-1个最小数据,并且已经排好顺序,并且A[i..n]A[i . . n]中是原始数组中除A[1..i−1]A[1 . . i −1]外的部分

证明:咳咳咳,参见上一问

d)冒泡排序的最坏情况运行时间是什么?比较它与插入排序的运行时间

解答:最差是 Θ(n2)\Theta(n^2) 这点跟插入排序一样;实际上冒泡排序的最好情况跟插入排序也一样,是Θ(n)\Theta(n) ,既在已排序序列中,只要一趟操作,做法就是每趟排序加一个判断,如果没有交换过就代表已经有序,立刻退出,然而在这道题的伪代码中没有看到这样的操作,so。。。。最好最差都是 Θ(n2)\Theta(n^2) 。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: