# 插入排序
# 代码实现
function insertSort(arr){
for (let i = 1; i < arr.length; i++) {
let next = i - 1 // 由于i是没有排过序的,i前面都是排过序的,所以要对小于i索引的数值进行比较
if(arr[i]<arr[next]){
let temp = arr[i] // 我们将要比较的值保存在临时编变量
while(next>=0 && temp<arr[next]){
arr[next+1] = arr[next]
next--
}
// 由于最后一个next--不符合while的执行条件,所以这里要对next+1操作,保证正确的插入位置
arr[next+1] = temp
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 解析
- 首先第一次遍历需要从数组的第二个元素和第一个元素进行比较,所以i要从索引1开始
- 首先要判断外层循环当前的索引值是否小于前一个数值,如果不小于,直接跳过内层循环,因为前面的值都是排过序的
- 外层循环当前索引值小于前一个索引值时,就要进入内层while循环了,在进入之前,要把当前索引对应的数值保存起来,然后再进行比较,将大于temp的值一次往后挪动,直到不符合内层循环条件,再将我们保存的临时变量中的数值,插入回来
- 插入回来时要将索引加1,因为在最后一次内层循环其实是不符合条件的,需要加回来