首先,給出本文要使用的例子,對乙個陣列a進行公升序的插入排序
演算法的c語言描述
[cpp]view
plain
copy
void
insersort(
inta,
intlength)
a[j+1] = key;
}
}
迴圈不變式是用於檢驗演算法的正確性的。
在演算法中,有一些特定的性質(也是我們我們實現這個演算法最關注的性質),它在迴圈迭代中是穩定不變的。
如插入排序演算法中,有迴圈不變式:當我們要第i個元素前,a[0,...,i-1]是有序的。
迴圈不變式有三個性質:
初始化: 第一次迭代前,迴圈不變式為真。如前面的**中,i=1時,迴圈不變式為真(因為i前面a[0]乙個元素,可以視為有序)
保持: 第n次迭代之前,為真,那麼在第n+1次迭代之前也一定為真。在插入a[i]時,a[i]只是找尋特定的位置插入,沒有破壞原來的不變式,
且a[i]插入後, 在下一次迭代之前(此時i已經自加),a[0,...,i-1]仍然有序。 類似數學歸納。
終止: 迴圈終止時,我們會得到乙個有用的性質,該性質有助於驗證演算法正確性。(迴圈不變式的終止時迴圈不變式裡最重要的一節),實際上,我們在迴圈終止時,也沒有破壞迴圈不變式的穩定性。
排序 插入排序(迴圈不變式)
插入排序的思想是構造乙個迴圈不變式,可用撲克牌的例子來解釋,左手為已經排好序的牌,右手為未排好序的牌,分別將右手中的牌依次一張一張地插入到左手,將左手中的每一張牌依次和這張牌比較,以此來確定這張牌在左手中的正確順序,然後進行下一張牌,在這個過程中,左手中的牌始終是排好序的,即不變的,稱為迴圈不變式 ...
演算法基礎 使用迴圈不變式解決插入排序問題
思想是直接插入排序,即每次拿乙個數字向已排序好的數字中插入,採用迴圈不變式的設計思想。迴圈不變式 一般而言,用這個式子表示希望得到的結果,如果在迴圈的每一步,這個式子都是正確的,那麼迴圈結束後,這個式子也正確,並得到了期望的結果。如何證明迴圈的每一步式子都是正確的?需要證明式子滿足三個性質 初始化 ...
《演算法導論》讀書筆記(一) 插入排序與迴圈不變式
第一次學習 演算法導論 按照讀書的順序將一些心得記錄下來 include using namespace std void insert sort int a,int length int main insert sort a,n for int i 0 i n i cout endl return...