一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情。
在上一篇写了冒泡排序,讲了它好比似hello world的存在,但是只了解一个冒泡还是远远不够的(至少面试中还会问你一句:你还会啥?🐶)。本篇就和大家分享一下插入排序.
直接插入排序
插入排序是一种最简单的
排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动. ——百度百科
算法实现分析
当我看完基础介绍后的想到的场景就是:就好似在斗地主,用右手去抓牌,左手是已经归档好顺序的牌,再插入对应的位置.
动画演示
步骤分析
- 从第二项开始,算作右手牌,依次与左手牌(已经是有序)进行比较
- 左手牌从后往前依次与右手牌比较,将大于右手牌的牌向后移动一位,然后将右手牌插入
- 步骤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);
源码地址,感兴趣的小伙伴可以看下吼~