算法学习:插入排序

chrome v8的 Array.sort 函数实现中(710行),当数组的长度小于等于22时,使用的就是插入排序,大于22使用的是快速排序。
更新于: 2021-12-19 12:57:29

场景

插入排序是一种非常简单的算法,最适合大部分已经被排好序的数据。在开始之前,通过可视化演示算法如何运作一个好主意。你可以参考前面的动画来了解插入排序的工作原理。

当输入的数组已经大部分被排好序时,插入排序的效果最佳。

 

问题分解

  1. 数组分成2部分
    1. 有序部分:第一个元素 [ arr[0] ]
    2. 其它元素:arr.slice(1)
  2. 实现一个 insert 方法:将一个元素,插入到一个有序的数组中去
  3. 组合1/2部分,实现插入排序

分步实现

var arr = [4, 2, 1, 3];

// 1. 将一个元素,插入到一个有序的数组中去
function insert(el, arr) {
  // el: 3; arr: [1,2,3,5,6]
  var idx = -1;
  for (var i = 0; i < arr.length; i++) {
    var cur = arr[i];
    if (el < cur) {
      idx = i;
      break;
    }
  }

  if (idx === -1) {
    arr.push(el);
  } else {
    arr.splice(idx, 0, el);
  }
}

// 2. 两个数组,一个有数,一个无序,按插入排序的方式进行排序
function isort(ordered, unordered) {
  // target: ordered
  for (var i = 0; i < unordered.length; i++) {
    var cur = unordered[i];
    insert(cur, ordered);
  }
  return ordered;
}

// 3. 将一个数组进行拆分成两个数组,一个为arr[arr[0]], 另一个为其它
function iisort(arr) {
  var ordered = [arr[0]];
  var unordered = arr.slice(1);
  return isort(ordered, unordered);
}

console.log(iisort([4, 2, 1, 3, 12, 1, 2, 5]));
// [1, 1, 2, 2, 3, 4, 5, 12];

参考

https://www.cnblogs.com/echolun/p/12644008.html

https://juejin.cn/post/6844903842866266125

https://segmentfault.com/a/1190000015489767

https://juejin.cn/post/6844904024030838798

https://cloud.tencent.com/developer/article/1391643