算法描述

插入排序是一种比较直观的排序方法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

  1. 从第一个元素开始,该元素可以认为已经被排序
  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描
  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置
  4. 重复步骤 3,直到找到已排序的元素小于或者等于新元素的位置
  5. 将新元素插入到该元素之后
  6. 重复 2 ~ 5

动图演示

InsertionSort.gif

算法实现

这里需要注意的地方也是边界的情况,如果在往后移动的过程发现到头了 j === 0,则可以直接将头部位置赋值为新元素。

  1. /**
  2. * 插入排序
  3. * @param {number[]} arr 数组
  4. */
  5. const insertionSort = (arr) => {
  6. let current
  7. for (let i = 1; i < arr.length; i++) {
  8. current = arr[i]
  9. for (let j = i - 1; j >= 0; j--) {
  10. if (current < arr[j]) {
  11. arr[j + 1] = arr[j]
  12. if (j === 0) arr[j] = current
  13. } else {
  14. arr[j + 1] = current
  15. break
  16. }
  17. }
  18. }
  19. return arr
  20. }