排序算法——插入排序


好久沒有寫文章了,前一陣子身體不適。從今天開始,想把各種排序算法總結一下,基礎才是最終要的,況且現在各種面試都會考到排序知識,希望我的文章能給大家帶來一些幫助。

這個排序系列沒有主要次要之分,也不按難易順序,完全隨機。今天先說說插入排序。

思想

插入排序的思想有點像打撲克抓牌的時候,我們插入撲克牌的做法。想象一下,抓牌時,我們都是把抓到的牌按順序放在手中。因此每抓一張新牌,我們都將其插入到已有的排好序的手牌當中,注意體會剛才的那句話。也就是說,插入排序的思想是,將新來的元素按順序放入一個已有的有序序列當中。

舉個例子可能更容易理解一些,假設有這樣一系列數字:

  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)的。我們都很清楚,這個時間復雜度在排序中並不能算好的。這也是為什么插入排序雖然簡單,但並沒有被廣泛應用的原因所在。


今天就到這里吧,吃飯去了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM