1. 程式人生 > >演算法導論 思考題 2-2

演算法導論 思考題 2-2

題目:

氣泡排序演算法的正確性

解答:

a)還需要證明什麼?

不等式證明了,終止條件也證明了,缺啥? 證明子陣列是原陣列的一部分,也就是說,A[i] i=1n 可以構成原陣列

b)對第2~4行的for迴圈給出一個準確的迴圈不變式,並證明該迴圈不變式是成立的

b問題就是證明每一趟的排序, 這種證明真是。。。要親命了,證明:

迴圈不變式:每次迭代中,A[j]=min{A[k]:jkn},並且子陣列是原陣列的一部分

初始化: 開始時,j=nA[j..n]中只有 A[n]一個元素,顯然成立

保持: A[j]A[j..n]中的最小值,那麼,由if判斷語句我們會發現,A

[j1]A[j],所以肯定會交換,這樣以來A[j] 就是 A[j1..n]中的最小值,由此下去,我們就會正確的把後一部分的最小值移動到前面已經排好的子序列裡面,加上前面排好的A[1..i+1] 是原陣列的子陣列,後面未排序的A[i+2..n]也是原陣列的子陣列,不變式成立

終止: 終止時i=nj=n,如果排序完成A[j]=min{A[k]:jkn} 顯然成立,因為A[j..n]中只有A[n]

c) 給出一個迴圈不變式,並且用它來證明 公式2.3(A[1]A[2]A[3]...A[n]

迴圈不變式:子陣列A[1..i1]裡是原始陣列中前i-1個最小資料,並且已經排好順序,並且A

[i..n]中是原始陣列中除A[1..i1]外的部分

證明:咳咳咳,參見上一問

d)氣泡排序的最壞情況執行時間是什麼?比較它與插入排序的執行時間

解答:最差是 Θ(n2) 這點跟插入排序一樣;實際上氣泡排序的最好情況跟插入排序也一樣,是Θ(n) ,既在已排序序列中,只要一趟操作,做法就是每趟排序加一個判斷,如果沒有交換過就代表已經有序,立刻退出,然而在這道題的虛擬碼中沒有看到這樣的操作,so。。。。最好最差都是 Θ(n2)