# 插入排序

插入排序和打扑克牌一样,摸到一张牌,然后和手里的每一张牌对比,把摸到的牌插入到正确位置(对比大小)。

# 算法步骤

将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)

# 动图演示

insertionSort

# 代码实现

// 插入排序
// 从小到大
// 循环次数为(n-1)+(n-2)+(n-3)+...+(n-(n-1)) => n(n-2)所以复杂度为O(n^2)
function insertionSort(arr) {
  // 排序轮数为 length - 1 次
  // 选择一个数,然后和前面已经排好序的进行比较
  for (let i = 1; i < arr.length; i++) {
    // 当前值比前面的已排序的最后一个元素小,说明需要排序,否则就不用排序了
    for (let j = i; j > 0 && arr[j] < arr[j - 1]; j--) {
      const temp = arr[j]
      arr[j] = arr[j - 1]
      arr[j - 1] = temp
    }
    console.log(arr)
  }
  return arr
}

const arr = [6, 3, 5, 2, 4, 1]

insertionSort(arr)

console.log(arr)