懶惰了好久,人有點生鏽,因此寫個算法系列讓本身腦筋活躍起來。算法
(全部範例一概從小到大排序)數組
插入排序的思路能夠參考抓撲克牌:假定咱們已有的撲克牌已經有序,如今抓了一張新牌,咱們須要插入到適當的位置以保持隊列依然有序。測試
插入排序code
給定數組:排序
var list = [ 54, 26, 93, 17, 77, 31, 44, 88, 55, 20 ];
算法描述:索引
當數組只有一個元素時,咱們認爲它有序(廢話);因此起始從i=1開始,既抓第二張牌後,選擇適當的位置;此時咱們將第二張牌與第一張牌比較,因爲26比54小,因此將54移動到第二個位置,最後將新牌既26放到首位,此時隊列前兩位有序:隊列
[ 26, 54, 93, 17, 77, 31, 44, 88, 55, 20 ]
如今i=2,既93與前一張比較,93比54大,因此不須要繼續向前比較了,保持不動便可;由於前兩位有序,93既然比54大,天然比54以前的任意元素大;此時隊列前3位有序;io
[ 26, 54, 93, 17, 77, 31, 44, 88, 55, 20 ]
如今i=3,既17依次與前一張比較,17與93比較,將93移動到後一位;17與54比較,54移動到後一位;17與26比較,26移動到後一位;最後隊列到達頂點,將17放到隊首;此時隊列前4位依然有序;console
[ 17, 26, 54, 93, 77, 31, 44, 88, 55, 20 ]
而後咱們重複一、二、3步驟,直到整個數組有序;function
第1輪: [ 26, 54, 93, 17, 77, 31, 44, 88, 55, 20 ] 第2輪: [ 26, 54, 93, 17, 77, 31, 44, 88, 55, 20 ] 第3輪: [ 17, 26, 54, 93, 77, 31, 44, 88, 55, 20 ] 第4輪: [ 17, 26, 54, 77, 93, 31, 44, 88, 55, 20 ] 第5輪: [ 17, 26, 31, 54, 77, 93, 44, 88, 55, 20 ] 第6輪: [ 17, 26, 31, 44, 54, 77, 93, 88, 55, 20 ] 第7輪: [ 17, 26, 31, 44, 54, 77, 88, 93, 55, 20 ] 第8輪: [ 17, 26, 31, 44, 54, 55, 77, 88, 93, 20 ] 第9輪: [ 17, 20, 26, 31, 44, 54, 55, 77, 88, 93 ]
算法實現:
function insert(list) { // 數組第一位有序,從第二位開始 for (let i = 1; i < list.length; i++) { let t = list[i]; let j = i - 1; // 從i-1依次向前遍歷,由於i以前的隊列有序,只要t比以前的元素小,都須要依次向後順移一位 for (; j >= 0 && t < list[j]; j--) { list[j + 1] = list[j]; } // 不知足條件時 說明j要麼爲-1,要麼list[j] >= t,因此賦值索引爲j+1 list[j + 1] = t; } } // 測試 var list = [ 54, 26, 93, 17, 77, 31, 44, 88, 55, 20 ]; insert(list); console.log(list); // [ 17, 20, 26, 31, 44, 54, 55, 77, 88, 93 ]