# 插入排序

# 代码实现

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

# 解析

  • 首先第一次遍历需要从数组的第二个元素和第一个元素进行比较,所以i要从索引1开始
  • 首先要判断外层循环当前的索引值是否小于前一个数值,如果不小于,直接跳过内层循环,因为前面的值都是排过序的
  • 外层循环当前索引值小于前一个索引值时,就要进入内层while循环了,在进入之前,要把当前索引对应的数值保存起来,然后再进行比较,将大于temp的值一次往后挪动,直到不符合内层循环条件,再将我们保存的临时变量中的数值,插入回来
  • 插入回来时要将索引加1,因为在最后一次内层循环其实是不符合条件的,需要加回来
Last Updated: 1/23/2022, 10:16:22 AM