你应该知道的排序算法-插入排序

164 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情

在上一篇写了冒泡排序,讲了它好比似hello world的存在,但是只了解一个冒泡还是远远不够的(至少面试中还会问你一句:你还会啥?🐶)。本篇就和大家分享一下插入排序.

直接插入排序

插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动. ——百度百科

算法实现分析

当我看完基础介绍后的想到的场景就是:就好似在斗地主,用右手去抓牌,左手是已经归档好顺序的牌,再插入对应的位置.

动画演示

1_.gif

步骤分析

  1. 从第二项开始,算作右手牌,依次与左手牌(已经是有序)进行比较
  2. 左手牌从后往前依次与右手牌比较,将大于右手牌的牌向后移动一位,然后将右手牌插入
  3. 步骤1,步骤2,为一次大循环,继续重复步骤1,2;完成排序

代码实现

function straightSort(arr: number[]) {
  if (arr.length === 1) {
    return arr;
  }
  let i = 1;
  let j;
  for(i; i< arr.length; i++) {
    const temp = arr[i]; // 拿到右手牌

    // 找到左手牌中哪些是大于右手牌的
    for(j = i - 1; j >=0  && arr[j] > temp; j--) {
      // 将大于右手牌的牌向后移动一位
      arr[j + 1] = arr[j];
    }
    // 最后将右手牌插入
    arr[j + 1] = temp;
  }
  return arr;
}

思考

算法思路很简单,主要是通过比较和移动。实现代码也很清晰简单,可以清楚的分析出时间复杂度: 如果是一个有序的数组,则只需要进行外循环,时间复杂度为: O(n); 如果是一个倒序的数组,则排第N个元素时,都需要与前N-1个元素进行比较,这前N-1个元素也都要后移,所以时间复杂度为: O(n^2);

源码地址,感兴趣的小伙伴可以看下吼~

更多推荐

  1. JavaScript浅尝二叉搜索树(BST)
  2. 关于斐波那契数列,你会几种呀!
  3. 如何用JS实现单链表?
  4. 你应该知道的排序算法-冒泡排序

f616ca9fc981d5e6214c5ef1a34fedf9.jpeg