概念
把數組分成兩部分,一部分是有順序的,第二部分是沒有順序的,從沒有順序的數組中拿出來一個,把他排在有序數組中的相應位置
時間複雜度
最好:O(n),原數組已經是升序的。
最壞:O(n²)
平均:O(n²)
代碼
// 插入算法
function insert_sort(arr) {
let leg = arr.length
for (let i = 1; i < leg; i++) {
let value = arr[i]
let j = i - 1;
for (; j >= 0; j--) {
if (arr[j] > value) {
arr[j + 1] = arr[j]
} else {
break
}
}
arr[j + 1] = value
}
}
var sortArr = [9, 6, 3, 5, 2, 1, 7, 343, 6, 643, 243, 544, 5, 63, 234, 0, 56, 123]
insert_sort(sortArr)
console.log(sortArr)
// [0, 1, 2, 3, 5, 5, 6, 6, 7, 9, 56, 63, 123, 234, 243, 343, 544, 643]
解釋
let value = arr[i] // 是從沒有順序的數組中取出來的 比較做的數
let j = i-1 // 是有序數組的長度
for (; j >= 0; j--) { //遍歷有序數組從大往小遍歷
// 從大往小,如果這個值比value大,當前的位置不是value,要把他後面的數全部往後移動一位,如果這個值比value小,說明當前位置是value的地方,
if (arr[j] > value) {
arr[j + 1] = arr[j]
}
arr[j + 1] = value // 把當前的位置放上value