《演算法導論》 演算法導論2 2 1插入排序

2021-06-06 22:14:41 字數 1675 閱讀 2843

2.1 插入排序。

我們分析的第乙個演算法是插入排序演算法,

輸入:n個數(a1,a2,a3,a4,a5,a6,a7…..an)

輸出:序列的乙個排列(即重新排序)(a1』,a2¬』,a3』)使a1』<= a2¬』<= a3』

插入排序演算法的偽**是以乙個過程的形式給出的,稱為insertion-sort,,它的引數是乙個陣列。包括了n個待排序的數。

偽**insertion-sort為

for j = 2,to length(a)

do key = a[j]

insertt a[j] into the sorted sequence a[1...j-1]

i = j-1;

while(i>0 and a[i]>key)

do a[i+1] = a[i]

i = i-1;

a[i+1] - key;

證明成立:

初始化:首先,先證明在第一輪迭代開始之前,迴圈不變式是成立的。此時j = 2,而子陣列a[1.2…j-1]。亦即,它只包含乙個元素a[1],實際上就是最初在a[1]中的那個元素。這個子陣列是己排序的(顯然的。),這樣就證明了迴圈不變式在迴圈的第一輪迭代開始之前是成立的。

保持:接下來,我們來考慮第二個性質:證明每一輪迴圈都能使迴圈不變式保持成立。從非形式化的門外 來看,在外層迴圈的迴圈體中,要將a[j-1],a[j-2]等元素向右移乙個位置,直到找到a[j]的適當位置為止。這裡將a[j]值插入。

結束:當j大於n時,外層for迴圈結束。

例項程式(自己先寫的。)可直接複製執行(vs2010)。

#include

#include

using namespace std;

int main()

;int n = sizeof(a)/sizeof(int);//陣列中int的個數

for(int i = 1;i < n;i ++)

else

break;//一旦有第乙個數值小於key值,則跳出迴圈,即已經排序好了。}}

for(int i = 0;i < n;i ++)//重?新?輸º?出?。¡ê

cout<

#include

using namespace std;

int main()

;int n = sizeof(a)/sizeof(int); //陣列中int的個數

for(int i = 1;i < n;i ++)

a[j+1] = key;

}for(int i = 0;i < n;i ++)//重新輸出。

cout<

#include

using namespace std;

int main()

for(int i = 1;i < n;i ++)

else

break;}}

for(int i = 0;i < n;i ++)//重新輸出

cout<

#include

#include

using namespace std;

int main()

else

break;}}

for(vector::size_type i = 0;i < a.size();i ++)返回型別為vector型別的size_type型。

coutcout<<*i<}

演算法導論 插入排序

introduction to algorithms second edition chapter2,insertion sort date 2014 9 14 include include include define max 50 typedef struct sortarr 直接插入排序 i...

演算法導論 插入排序

插入排序應該算是比較好理解的一種了,原理類似於我們打牌的時候,摸牌插入手中的情景。來看一下圖,立刻就明白了 我們將乙個陣列int a 12 看做一副撲克牌,假設陣列有12個數,那麼撲克牌也一共有十二張,放在一起開始 我們先抽一張拿到手上,這時候,我們不需要排序,因為不論哪一張先被我們抽上來,不論大小...

演算法導論 插入排序

對於只有乙個元素的陣列,本身為已序。對於兩個元素的a,認為 a0 為已序,a1為key 若key a0 則將key 放到a0後。若不是,後移a0 對於多個元素的陣列 考慮將key 插入到已序的 a0 aj a0 a1 a2.中,可以將key 與aj a0 逐個比較,並後移,直到遇到乙個比key 小的...