原文:
插入排序
插入排序(Insertion-Sort)的算法描述是一種簡單直觀的排序算法。它的工作原理是通過構建有序序列,對於未排序數據,在已排序序列中從后向前掃描,找到相應位置並插入。
算法描述:
一般來說,插入排序都采用 in-place 在數組上實現:
- 從第一個元素開始,該元素可以認為已經被排序;
- 取出下一個元素,在已經排序的元素序列中從后向前掃描;
- 如果該元素(已排序)大於新元素,將該元素移到下一位置;
- 重復步驟3,直到找到已排序的元素小於或者等於新元素的位置;
- 將新元素插入到該位置后;
- 重復步驟2~5。
動圖演示:

代碼實現:
function Insertion(arr) {
let len = arr.length;
let preIndex, current;
for (let i = 1; i < len; i++) {
preIndex = i - 1;
current = arr[i];
while (preIndex >= 0 && current < arr[preIndex]) {
arr[preIndex + 1] = arr[preIndex];
preIndex--;
}
arr[preIndex + 1] = current;
}
return arr;
}
var arr = [3,5,7,1,4,56,12,78,25,0,9,8,42,37];
Insertion(arr);
理一下大體思路:
1.默認從 i = 1 開始判斷,這樣 preIndex 自然是內部循環的游標;
2.current 保存 arr[i],通過循環來確定 current 的最終位置;
3.每個內循環開始的時候,arr[i] === current === arr[preIndex + 1],所以在內循環首次時 arr[preIndex + 1] = arr[preIndex] 的時候不必擔心 arr[i] 的值丟失;
4.總體思路是,需要排位的元素先額外緩存起來,然后套用內循環,使得需要調整的元素賦值給它后面的一個位置上,形成依次挪位,最后因為內循環在判斷條件不生效的時候停止意味着找到了需要排位的元素的正確位置,然后賦值上去,完成排序。
算法分析:
插入排序在實現上,通常采用in-place排序(即只需用到O(1)的額外空間的排序),因而在從后向前掃描過程中,需要反復把已排序元素逐步向后挪位,為最新元素提供插入空間。
