簡明算法: 插入排序(javascript描述)

懶惰了好久,人有點生鏽,因此寫個算法系列讓本身腦筋活躍起來。算法

(全部範例一概從小到大排序)數組

插入排序的思路能夠參考抓撲克牌:假定咱們已有的撲克牌已經有序,如今抓了一張新牌,咱們須要插入到適當的位置以保持隊列依然有序。測試

插入排序code

給定數組:排序

var list = [ 54, 26, 93, 17, 77, 31, 44, 88, 55, 20 ];

算法描述:索引

  1. 當數組只有一個元素時,咱們認爲它有序(廢話);因此起始從i=1開始,既抓第二張牌後,選擇適當的位置;此時咱們將第二張牌與第一張牌比較,因爲26比54小,因此將54移動到第二個位置,最後將新牌既26放到首位,此時隊列前兩位有序:隊列

    [ 26, 54, 93, 17, 77, 31, 44, 88, 55, 20 ]
  2. 如今i=2,既93與前一張比較,93比54大,因此不須要繼續向前比較了,保持不動便可;由於前兩位有序,93既然比54大,天然比54以前的任意元素大;此時隊列前3位有序;io

    [ 26, 54, 93, 17, 77, 31, 44, 88, 55, 20 ]
  3. 如今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 ]
  4. 而後咱們重複一、二、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 ]
相關文章
相關標籤/搜索