说明
每次都将当前元素插入到左侧已经排序的数组中,使得插入之后左侧数组依然有序。当数组[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] |