說明
每次都將當前元素插入到左側已經排序的數組中,使得插入之後左側數組依然有序。當數組[3,4,1]排序時,先將[3]歸爲已排序的數組,[4,1]爲未排序數組,遍歷未排序數組,先取4和3比較,正序排序就不變,反序就交換兩個值。…遍歷完成,已排序數組越來越大,未排序數組越來越少。直到排序完成。
時間複雜度
插入排序的時間複雜度取決於數組的初始順序,如果數組已經部分有序了,那麼逆序較少,需要的交換次數也就較少,時間複雜度較低。
示例
function insertion(nums: number[]) {
let len = nums.length;
for (let i = 1; i < len; i++) {
for (let j = i; j > 0; j--) {
// 交換兩個值 判斷條件 正序反序
if (nums[j] < nums[j - 1]) {
swapInsertion(nums, j, j - 1);
}
}
}
return nums;
}
/**
* 交換數組中兩個值
* @param {number[]} nums -js中數組是引用類型
* @param {number} i
* @param {number} min
*/
function swapInsertion(nums: number[], i: number, min: number) {
var swapValue = nums[i];
nums[i] = nums[min];
nums[min] = swapValue;
}
const insertionNumbers = [3, 4, 1];
console.log(insertion(insertionNumbers));
排序示例
步驟 | 已排序 | 未排序 | 總數組 |
---|---|---|---|
1 | [3] | [4,1] | [3,4,1] |
2 | [3,4] | [1] | [3,4,1] |
3 | [1,3,4] | [] | [1,3,4] |