有且仅有的10个常见的排序算法,东西不多,怎么就背不下来呢

就这么跟你说吧,面试中肯定会出排序算法的算法题,你只需要背下来代码+背下来他们的时间复杂度和空间复杂度就能蒙混过关。

不管你是前端还是后端,关于排序的算法有且仅有这 10个,如果你用心了,怎么会记不住呢。看完这篇文章你还没记住,就说明你是笨蛋。

好吧,最最坏的情况下,也需要记住这个8【冒泡、选择、插入、希尔、归并、快速、桶、堆】

可以把所有排序分成三类

第一类【冒泡 + 选择 + 插入 + 希尔】重点是使用【循环+交换】【 O(n^2)】

第二类【归并 + 堆排序 】重点是【辅助函数 + 递归】【O(nlogn)】

第三类【快速排序】他自己一组,说明很重要,使用【递归思想【O(nlogn)】

第三类【计数 + 桶 + 基数】重点是使用【额外空间桶】【O(n+k)】

一、循环+交换

1.1 冒泡排序

这个是你必须会的,我记得之前最先学的就是这个算法,因为他最简单,但是因为他的时间复杂度大,所以考的概率确实最小的,但是你怎么可以不会这么简单的排序呢?

冒泡排序分为三个,一个是基本的冒泡排序,二个改进的冒泡排序,我建议是至少记住一个基本的一个改进的。冒泡排序的时间复杂度都是 o(n^2)

改进的冒泡排序你一定要学会,因为如果你在面试中答了简单的冒泡排序,面试官一定会问你,有没有什么地方可以优化?如果你一步到位写出改进的冒泡排序说不定人家就放过你了。

1.1.1 基本的冒泡排序

记住一个关键字【双层 for 循环】

  1. 外层 for 循环 i < len
  2. 内层 for 循环 j 初始化为 0,j < len - i - 1
  3. 使用内层 for 循环交换元素
  4. 时间复杂度是 n^2, 因为有两层 for 循环
  5. 注意是升序排序,还是降序排序
function bubbleSort(arr) {
    let len = arr.length
    for (let i = 0; i < len; i++) {
        for (let j = 0; j < len - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                let temp = arr[j + 1]
                arr[j + 1] = arr[j]
                arr[j] = temp
            }
        }
    }
    return arr
}
var arr = [1, 10, 8, 2, 30];
console.log(bubbleSort(arr));

1.1.2 改进的冒泡排序

记住关键子【while 循环 + for 循环 + pos 位置信息】

  1. 设置一个位置信息 pos 记录每趟排序中最后一次进行交换的位置
  2. pos 初始化为0 ,在 while 循环内初始化,每次循环都重置
  3. pos 位置之后的记录均已经交换到位
  4. 在交换的时候 if 语句内更新 pos
  5. 内层 for 循环 j < i 
  6. 在下一趟排序时,只需要扫描到 pos 位置即可【说明 posm是用来改变循环终止位置的】
  7. 注意 while 循环一定要有更改 while 循环条件的语句,这里就使用 pos
  8.  时间复杂度还是为O(N^2)

function bubbleSort(arr) {
    let i = arr.length - 1
    while (i > 0) {
        let pos = 0
        for (let j = 0; j < i; j++) {
            if (arr[j] > arr[j + 1]) {
                // 记录位置
                pos = j
                let temp = arr[j + 1]
                arr[j + 1] = arr[j]
                arr[j] = temp
            }
        }
        // 更改 while 循环条件
        i = pos
    }
    return arr
}
var arr = [1, 10, 8, 2, 30];
console.log(bubbleSort(arr));

1.1.3 终极版的冒泡排序

关键值【while 循环和2个for循环 +下标 最大值和最小值】

  1. 这个是在 1.2 的基础上再进行优化的
  2. 关键是使用最大值和最小值的概念【这里是指的下标的最大最小值】
  3. 正向冒泡,找到最大值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我有一棵树

感谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值