演算法導論 2 2 氣泡排序的正確性

2021-10-09 13:44:26 字數 1667 閱讀 6085

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

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

其中 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 解答:

氣泡排序的時間開銷為θ(

krusal演算法正確性的證明

krusal演算法步驟如下 新建圖g,g中擁有原圖中相同的節點,但沒有邊 將原圖中所有的邊按權值從小到大排序 從權值最小的邊開始,如果這條邊連線的兩個節點於圖g中不在同乙個連通分量中,則新增這條邊到圖g中 重複3,直至圖g中所有的節點都在同乙個連通分量中 為什麼這一定是最小生成樹呢?關鍵還是步驟3中...

Dijkstra演算法正確性證明

問題 求圖中點1到其他各點的最短距離 演算法描述 設初始時圖的所有點的集合u 把起點s放入初始集合set中 u u set set 找s經過集合set中的點,能達到的距離最短的點k k in u 將k併入set 言外之意k的前乙個點必然屬於set u u set set 由於每次引入的只有乙個點k,...

Dijkstra演算法正確性證明

問題 求圖中點1到其他各點的最短距離 策略 1.把起點1放入初始集合set中,從剩餘的點中,選取到set 此時set中只有1個點 距離最近的點,併入集合set中,2.從剩餘的點中,找經過集合set,到起點1的最短距離,將最短邊併入set集合 3.依次迴圈,直到所有的邊都併入set 變數的命名 set...