• 冒泡排序


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

      BubbleSort(A)
    1 for (int i = 1; i < A.Length; i++)
    2     for (int j = A.Length; j > i; j--)
    3        if (A[j] < A[j - 1])
    4            exchange(A[j-1],A[j]);        

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

    A'[1]<=A'[2]<=......<=A'[n]  //不等式(2.3)

    为了证明BubbleSort确实完成了排序,我们还需要证明什么?下面两部分将证明不等式(2.3)。

    b.为内循环精确的说明一个循环不变式,并证明该循环不变式成立。

    c.使用(b)部分证明的循环不变式的终止条件,为外循环说明一个循环不变式,该不变式将使你能证明不等式(2.3)。

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


    答:

    b.内循环将找出A[i...n]中最小元素,并赋值给A[i]。

    循环不变式证明如下:

    初始化:当j=n时,if(A[n]<A[n-1]) exchange(A[n],A[n-1]);推出A[n-1]为A[n-1...n]中最小的元素。

    保持:非形式化地,第2-4行将A[j-1]和A[j]比较,将较小值的元素赋给A[j-1],当执行j--后,上次一次A[j-1]为该次的A[j],再次与前一个元素比较,

    并将较小值的元素赋值给A[j-2]。当j=k时,有A[k-1]为A[k-1...n]中的最小的元素。则当j=k+1时,有A[k]为A[k...n]中的最小元素。

    终止:当j=i+1时循环终止,此时有A[i]为A[i...n]中的最小的元素。

    c.外循环将A[1...i]排列有序。

    初始化:i=1时,内循环将找出A[1...n]中的最小值,并赋值给A[1]。A[1]仅有一个元素,故A[1]已有序。

    保持:如果i=k时,A[1...k]已有序(即:A'[1]<=A'[2]<=...A'<=[k])。

    则当i=k+1时,内循环将找出A[k+1...n]中最小的元素,并赋值给A[k+1]。故此时有A'[1]<=A'[2]<=...A'<=[k]<=A'[k+1],即A[1...k+1]已有序。

    终止:当i=n-1时,有A'[1]<=A'[2]<=...<=A'[n-1],而A'[n-1]是A[n-1]与A[n]中较小者,故定有A'[n-1]<=A'[n]。

    d.T(n)=(n-1)c1+∑i(n+1-i)c2+∑i(n-i)(c3+c4)  (其中i为1到n-1)

       =an2+bn+c

    与插入排序Θ(n2)运行时间一样。

  • 相关阅读:
    BZOJ 1221 [HNOI2001] 软件开发 费用流_建模
    BZOJ 1180 / 2843 LCT模板题 + 双倍经验
    bzoj 4372: 烁烁的游戏 动态点分治+树链剖分+线段树
    bzoj 3730: 震波 动态点分治+树链剖分+线段树
    luogu P2634 [国家集训队]聪聪可可 点分治
    bzoj 1468: Tree 点分治
    bzoj 1296: [SCOI2009]粉刷匠 动态规划
    bzoj 1293: [SCOI2009]生日礼物 问题转化 + 性质分析 + 滚动数组优化
    BZOJ 1042: [HAOI2008]硬币购物 容斥原理+背包
    matplotlib模块
  • 原文地址:https://www.cnblogs.com/wyh19930325/p/5406030.html
Copyright © 2020-2023  润新知