算法导论 2-2 冒泡排序的正确性

(冒泡排序的正确性)冒泡排序是一种流行但低效的排序算法,它的作用是反复交换相邻的未按次序排列的元素。

a. 假设A' 表示BUBBLESORT(A)的输出。为了证明BUBBLESORT正确,我们必须证明它将终止并且有:

{\color{Red} A'[1]\leq A'[2]\leq...\leq A'[n]}   (2.3)

其中 n = A.length 。为了证明 BUBBLESORT 确实完成了排序,我们还需要证明什么?

下面两部分将证明2.3 。

b. 为第 2~4 行的for循环精确地说明一个循环不变式,并证明该循环不变式成立。你的证明应该使用本章中给出的循环不变式证明的结构。

c. 使用(b)部分证明的循环不变式的终止条件,为第1~4行的for循环说明一个循环不变式,该不变式将使你能证明不等式(2.3)。你的证明应该适用本章中给出的循环不变式证明的结构。

d. 冒泡排序的最坏运行时间是多少?与插入排序的运行时间相比,其性能如何?

a 解答:

我们还需要证明所有元素由原来的数组A中原来的元素组成。

b 解答:

2~4行的代码维持的循环不变式是:对于每一次循环迭代开始时,保证A[j]为A[j..n]中最小的元素,且A[j..n]的元素数组A原来的元素组成。

初始化:在第一次循环开始时,A[j..n]由一个A[j]组成,因为只有一个元素,循环不变式成立。

保持:如果循环迭代时循环不变式为真,那么执行本次循环时,如果存在A[j-1]>A[j],A[j-1]将会与A[j]交换,否则不进行交换。那么本次循环可以保证A[j-1]为原来的A[j]和A[j-1]中最小的一个,并且也保证了A[j-1]和A[j]由原来的A[j-1]和A[j]两个元素组成。由于原来的A[j]已经是A[j..n]中最小的元素,那么本次循环将保证A[j-1]为A[j-1..n]中最小的元素,故循环不变式成立。

终止:导致循环的终止条件为 j = i,在循环终止时,最后一次执行循环的j值为i+1,此时代码执行完毕将保证如果A[i]小于A[i+1],则A[i]将与A[i+1]置换,这个逻辑保证了代码执行过后的A[i]将为A[i..n]中最小的元素。

c 解答:

1~4行的代码维持的循环不变式是:对于每一次循环开始时,对于每一次执行循环的索引i,将保证A[1..i-1]已按非降序排序,且A[1..i-1]中的元素为数组A原来的元素,并且是由数组中最小的元素组成。代码执行后,整个数组A中的所有元素保持不变,只有索引上发生了变化。

初始化:在第一次循环开始时,A[1..i-1]为空数组,故循环不变式成立。

保持:如果循环迭代时循环不变式为真,那么执行本次循环时,A[1..i-1]将满足循环不变式的条件,而在进行本次循环后,代码2~4将保证A[i]为A[i..n]中最小的元素,又因为A[1..i-1]为数组中最小元素组成,所有可以推断A[i]必将大于A[1..i-1]中的每一个元素,又因为A[1..i-1]是已排序的,那么A[1..i]肯定也是已排序的子数组。又由于A[i]是A[i..n]最小的元素,可以进一步推断出A[1..i]已排序且A[1..i]为数组A中原来的袁术,并且由数组中最小的元素组成。

终止:循环终止时,i的值为n,此时A[1..n-1]将满足循环不变式,由于A[1..n-1]由整个数组A中最小的元素组成,所以A[n]必将大于A[1..n-1]中任何元素,又由于A[1..n-1]已排序,因此得知A[1..n]也已经排好序。本循环不变式正确。

d 解答:

冒泡排序的时间开销为θ(n^{2}) 。冒泡排序在最坏情况下,每次都要执行置换动作,而最好情况则不必。但是无论最好还是最坏情况,期执行时间的循环次数总是不变,因此时间开销总是为θ(n^{2})。而插入排序虽然最坏情况下时间开销为θ(n^{2}),但是在最好情况下其时间开销为θ(n),并且一旦找到插入位置,子循环将立刻终止,而冒泡排序的每次子循环都会进行到底。所以总体而言插入排序性能更优。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值