懒惰了好久,人有点生锈,因此写个算法系列让本身脑筋活跃起来。算法
(全部范例一概从小到大排序)数组
插入排序的思路能够参考抓扑克牌:假定咱们已有的扑克牌已经有序,如今抓了一张新牌,咱们须要插入到适当的位置以保持队列依然有序。测试
插入排序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 ]