算法导论 思考题 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) 。
相关文章推荐
- java之Secure hash functions
- java中的基本类型
- 堆排序
- java设计模式之策略
- 关于安卓应用方法过多的问题
- 统计你的手机号码中出现次数最多的数字,并打印出此数字及其出现次数
- 《Java程序设计》实验二 实验报告
- 归并排序 & 数组中的逆序对 【java实现】
- 数据库 - E-R模型设计
- spark1.4的本地模式编程练习(1)
- java字节码指令集
- 视频直播的购物平台,网站,app
- 心理测试题--有点长
- activiti 动态配置 activiti 监听引擎启动和初始化(高级源码篇)
- activiti 动态配置 activiti 监听引擎启动和初始化(高级源码篇)
- Windows7环境,登录samba服务器后如何注销
- 数组中取出下标不连续的任意个数,求取出的数的和的最大值
- uboot第二阶段
- Array 的五种迭代方法(every/filter/forEach/map/some)
- 【C#】详解使用Enumerable.Distinct方法去重