算法導論(第三版)第二章思考題2-2 (冒泡排序的正確性) 冒泡排序是一種流行但低效的排序算法...

(冒泡排序的正確性) 冒泡排序是一種流行但低效的排序算法,它的作用是反覆交換相鄰的未按次序的排列的元素.

BUBBLESORT(A)

    1 for i = 1 to A.length - 1
    2     for j = A.length downto i + 1
    3         if A[j] < A[j - 1]
    4             exchange A[j] with A[j-1]

a. 假設A' 表示 BUBBLESORT(A)的輸出. 爲了證明BUBBLESORT正確, 我們必須證明它將終止並且有:

    A'[1]<=A'[2]<=...<=A'[n]    (2.3)

其中n=A.length. 爲了證明BUBBLESORT確實完成了排序,我們還需要證明什麼?

下面兩部分將證明不等式(2.3).

b.爲2~4行的for循環精確地說明一個循環不變式,並證明該循環不變式成立.

你的證明應該使用本章中給出的循環不變式證明的結構

    初始化:
        首先證明在第一次迭代之前(當j=2時), 循環不變式成立.
        所以對子數組A[A[2],...,A.length]進行排列
        如果A[2]<A[1] 就交換A[2]和A[1] 這時 A[1]<=A[2]
    保持:
        如果A[j]<A[j-1] 就交換A[j]和A[j-1] 這時A[j-1]=A[j] A[j]爲當前循環到的最大的數
    終止:
        在排列A.length-1次後 j=A.length 最後排列結果爲: A[j-1]<=A[j] A[j]爲整個A中最大的數

c. 使用(b)部分證明的循環不變時的終止條件,爲第1~4行的for循環說明一個循環不變式,該不變式將使你能證明不等式(2.3).你的證明應該使用本章中給出的循環不變式證明的結構.

    初始化:
        首先證明i=1時,循環不變式成立
        根據b得出的結果 i=1時找出了A.length中最大的數 放在A的最後
    保持:
        1<i<A.length-1, j = i+1
        根據b得出的結論 剩餘未找到最大數的數字有A.length-j個 對A.length-j個數找最大數 放在A.length-j個數的最後
        循環完成後 有j個數是按照從小到大依次排列在A.length的最後部分的
    終止:
        當i = A.length-1,j = A.length時 循環不變式結束 所有數都按照從小到大依次排列完成

d.冒泡排序的最壞運行時間是多少?與插入排序的運行時間相比,其性能如何?

冒泡排序 對n個數進行排序

第一行i循環 執行時間(n-1)*c1

第二行j循環 執行時間(1+2+...+n-1)*c2

第三行比較 執行時間(1+2+...+n-1)*c3

第四行交換 執行時間(1+2+...+n-1)*c4

加起來運行時間是(n-1)*n/2*(c2+c3+c4)+(n-1)*c1

最壞運行時間θ(n^2) 與插入排序相比 其時間複雜度相同

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章