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

InsertionSort.gif
代碼實現(xiàn):
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);
理一下大體思路:
- 默認從 i = 1 開始判斷,這樣 preIndex 自然是內(nèi)部循環(huán)的游標;
- current 保存 arr[i],通過循環(huán)來確定 current 的最終位置;
- 每個內(nèi)循環(huán)開始的時候,arr[i] === current === arr[preIndex + 1],所以在內(nèi)循環(huán)首次時 arr[preIndex + 1] = arr[preIndex] 的時候不必擔心 arr[i] 的值丟失;
- 總體思路是,需要排位的元素先額外緩存起來,然后套用內(nèi)循環(huán),使得需要調整的元素賦值給它后面的一個位置上,形成依次挪位,最后因為內(nèi)循環(huán)在判斷條件不生效的時候停止意味著找到了需要排位的元素的正確位置,然后賦值上去,完成排序。