Skip to content

插入排序(insertSort) ​

排的是真的慢!

思路 ​

类似于打扑克的时候整牌 会按照顺序插入

  1. 创建一个自己的数组 初始空数组(可以直接用原数组 做到原地 pai'xu)

  2. 把原数组的第一项 push 进自己数组

  3. 拿原数组的除第一项的 item去和自己数组的每一项依次比较

  4. 如果原数组的 item 和自己的数组每一项都比过

    如果原数组的 item 比自己数组每一项都大 则插入到自己数组最后

    如果原数组的 item 比自己数组的第 T 项小或者相等 则自己数组从 T 开始包括 T 都往后位移一个位置 (这时第 T 项变为了 T+1) 腾出来的 T 位置插入原数组的 item

  5. 就这样原数组的 item 一直找自己数组的位置插

js
例如:
初始值 (5) [3, 2, 1, 4, 5]


数组 []
我和你的每一项去比 3

数组 [3]
我和你的每一项去比 2

数组 (2) [2, 3]
我和你的每一项去比 1

数组 (3) [1, 2, 3]
我和你的每一项去比 4

数组 (4) [1, 2, 3, 4]
我和你的每一项去比 5


排序后 (5) [1, 2, 3, 4, 5]

实现 ​

js
//宏观逻辑
function sort(elements) {
  // 创建一个自己的数组
  var res = [];

  // 遍历原数组
  elements.forEach((item) => {
    //传入自己创建的数组 和原数组的每一位去比较
    compare(res, item);

    console.log("自己的数组", res);
    console.log("自己数组item和原数组的这一项去比", item);
  });

  return res;
}

//比较逻辑
//传入值为自己创建的数组 和原数组的item
//这里传入的arr为上面自己造的res 栈地址是一样的 所以这个函数里操作arr 就是在改自己造的数组
function compare(arr, x) {
  //自己创建的数组的length
  var len = arr.length;

  // 开关
  var temp = false;

  //遍历自己创建的数组
  for (var i = 0; i < len; i++) {
    //如果第一次进来就直接插进去 退出拿原数组第二个来比 要不然undefined怎么比?
    if (len == 0) {
      arr.push(x);
      break;
    }

    //如果原数组的item 小于等于 自己创的数组的某一项
    if (x <= arr[i]) {
      //从后循环自己创建的数组到大于等于原数组的那个值的下标结束
      for (var j = len; j > i; j--) {
        //自己创建的数组从 大于原数组的那个值的下标哪里都往后推一项
        arr[j] = arr[j - 1];
      }

      //并且把原数组item插入进入
      arr[i] = x;

      //打开开关
      temp = true;

      //结束 循环 因为已经插入数值 不能在比了
      break;
    }
  }

  //如果自己创建的数组里的每一项 都比原数组的item小 就把他添加到自己创建数组的最后去
  !temp && arr.push(x);
}

//测试代码……

let a = [3, 2, 1, 4, 5];
// let a = Array(10).fill(1).map(() => {
// return Math.floor(Math.random() * (Math.floor(1000) - Math.ceil(0)) + Math.ceil(0))
// })
console.log("初始值", a);
console.time();
let b = sort(a);
console.timeEnd();

console.log(b === a); //false
console.log("排序后", b); //结果不会去重

简洁版

依次比较当前值与已排序的值,找到当前值在之前已排序的数组中的合适位置,将其插入。

ts
let arr = [53, 2, 2, 6, 63, 312, 23, 6, 74, 6, 2, 8, 856, 85, 75, 4, 7, 8, 9, 9];

function insertSort(arr: Array<number>): Array<number> {
  if (!arr.length) return null;

  for (let i = 0; i < arr.length; i++) {
    for (let j = 0; j < i; j++) {
      if (arr[i] < arr[j]) {
        [arr[i], arr[j]] = [arr[j], arr[i]];
      }
    }
  }
}

insertSort(arr);
console.log(arr);

学到了什么 ​

  1. 就是学到了一种新的排序思想……

未解 ​

  1. 怎么在 insertSort 中加入去重?