(冒泡排序的正確性) 冒泡排序是一種流行但低效的排序算法,它的作用是反覆交換相鄰的未按次序的排列的元素.
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) 與插入排序相比 其時間複雜度相同