好久沒有寫文章了,前一陣子身體不適。從今天開始,想把各種排序算法總結一下,基礎才是最終要的,況且現在各種面試都會考到排序知識,希望我的文章能給大家帶來一些幫助。
這個排序系列沒有主要次要之分,也不按難易順序,完全隨機。今天先說說插入排序。
思想
插入排序的思想有點像打撲克抓牌的時候,我們插入撲克牌的做法。想象一下,抓牌時,我們都是把抓到的牌按順序放在手中。因此每抓一張新牌,我們都將其插入到已有的排好序的手牌當中,注意體會剛才的那句話。也就是說,插入排序的思想是,將新來的元素按順序放入一個已有的有序序列當中。
舉個例子可能更容易理解一些,假設有這樣一系列數字:
8 2 4 9 3 6 首先我們考慮數字2,假設后面的數字不存在(手中只有一張8,又抓來了2),那么顯然2應該放在8的前面。
2 8 4 9 3 6 又抓來了一張4,現在大家都知道應該怎么辦了吧?
2 4 8 9 3 6 又來了個9,沒錯,正好不用換順序
2 4 8 9 3 6 同樣的道理,考慮3該放的位置,顯然放在2和4的中間
2 3 4 8 9 6 最后一個也是一樣,最后得到從小到大的序列
2 3 4 6 8 9 完成排序
怎么樣,這下全明白了吧,其實很簡單。
代碼
printline("before sort:", v);
for (int i=1; i<v.size(); i++){
int key = v[i];
int j = i-1;
while (j >= 0 && v[j] > key){
v[j+1] = v[j];
j--;
}
v[j+1] = key;
}
printline("after sort:", v);
代碼中,key相當於每次要比較的元素。
分析
插入排序的思路很簡單,很清晰,是一種最常見最簡單的排序方法。但是可以看出,由於需要兩層循環,外層循環n-1次,內層循環每次遞增一次。當輸入完全從小到大有序時,只需要常數的時間,這當然是最好的情況。但是我們不能期望輸入,當輸入完全逆序時,最壞的情況就出現了,顯然時間復雜度是O(n*n)的。我們都很清楚,這個時間復雜度在排序中並不能算好的。這也是為什么插入排序雖然簡單,但並沒有被廣泛應用的原因所在。
今天就到這里吧,吃飯去了。