插入排序每次排一个数组项,以此方式构建最后的排序数组。
每次排的数组项依次增加1,第一次需要排序的数组项为1,第二次为2,直到需要排序数组的长度。
思路
数组长度为n
需要比j较n轮
每轮需要比较:直到当前比较的数大于前面排好的数组的某个数组项为止
每次比较满足条件就交换位置
1
2
3
4
5
6
7
8
9
10
|
let array = [2, 5, 1, 4, 3]
for(let i = 0; i < array.length; i++){
let j = i
let tem = array[i]
while(j > 0 && tem < array[j - 1]){
[array[j],array[j-1]] = [array[j-1],array[j]] // 解构赋值
j--
}
}
console.log(array)
|
注意观察j和i的赋值情况,为什么不用下面这种写法
1
2
3
4
5
6
7
8
9
10
|
const array = [5,4,3, 2, 1]
for(let i = 0; i < array.length; i++){
let j = i
let tem = array[j + 1]
while (j >= 0 && tem < array[j]){
[array[j], array[j + 1]] = [array[j + 1], array[j]];
j--
}
}
console.log(array)
|
因为这个写法不好,需要额外比较一次(索引为0时)和当索引为最大时array[j+1]会数组溢出
插入排序算法的关键点在于,从少到多这个过程,每次都是排好序的。
使用while循环不使用for循环是更符合语义的。
排序小型数组时,此算法比选择排序和冒泡排序性能要好,因为插入排序的每轮的比较都是在已经排好序的数组中比较插入可以减少比较的次数,而冒泡和选择都是需要比较全部剩余数组项。