前端笔试题——手撕快速排序(保姆级手撕)

引言:

许多互联网公司在招聘前端开发人才时,不仅考察面试者对于前端知识的掌握程度,数据结构与算法也渐渐成为了默许的要求。

除了考察链表、二叉树、图等数据结构以外,在算法中最具有代表性的就是“手撕”快速排序算法。

快速排序算法,对于大多数人而言确实具有一定的难度。排序思路,代码设计以及难以理解的递归思想。

本文一步步带你写基于原生JavaScript语言的快速排序算法。

思想:

快速排序最核心的是分治思想,顾名思义,分而治之。

简单来说就是,按照一个标准(也称基准),将一个集合划分为多个集合,分开求解。

再通俗一点就是,将强大的敌军分成一块一块的,再逐个击破。

举个例子:

这个数组是乱序的。现在我们模拟快速排序的过程。

首先第一趟是这样的:

1.我们规定基准是当前数组第一个元素,也就是array[0]。

2.将当前数组遍历,比基准小的放left里,大的放right里。

3.一趟完成时,array会被划分为left、mid和right三部分。

如图所示:没有比mid小的元素,所以left数组里是空的;除mid外,其他比mid值大的元素全在right里。

第二趟也是同样的道理:

1.对于left数组为空,则忽略。

2.对于right数组,里边的元素数量不止一个,那么就可以进行第二趟快排了:

接着再对left和right分别进行划分,快排,宏观看来就是这样:

这种结构是不是非常熟悉,有点像二叉树呢?

设计与实现:

我们搞懂了过程,现在我们需要设计算法了。

在笔试中需要手撕快排,最好的办法就是尽量精简代码,写着也容易,看着也舒服!

根据前边我们看到的结构,是不是能够联想到二叉树的遍历呢?

二叉树遍历最精简的代码就是使用递归。(不管先序、中序还是后序)

说白了,递归就是在函数中调用自己,返回自己。

但最重要的还是要有个终止条件,也就是当数组中的元素数量不大于一个时,就没必要排序了。

无论怎样,先定义个quickSort方法:

function quickSort(arr) {
    if (arr.length <= 1) {
        return arr;
    }
}

然后我们还需要定义数组left和right,还要将mid初始化为arr[0]。

function quickSort(arr) {
    if (arr.length <= 1) {
        return arr;
    }
    let left = [];
    let right = [];
    let mid = arr[0];
}

这时我们就要遍历数组了,从mid后边的元素开始。

若第i个元素比mid小,就放到left中。

若第i个元素比mid大或者一样大,就放到right中。

所以,上代码:

function quickSort(arr) {
    if (arr.length <= 1) {
        return arr;
    }
    let left = [];
    let right = [];
    let mid = arr[0];
    for (let i = 1; i < arr.length; i++) {
        if (arr[i] < mid) {
            left.push(arr[i]);
        } else {
            right.push(arr[i]);
        }
    }
}

这样,第一趟排序的结果就可以知道了,我们用js的concat方法将left、mid和right拼接一下。

function quickSort(arr) {
    if (arr.length <= 1) {
        return arr;
    }
    let left = [];
    let right = [];
    let mid = arr[0];
    for (let i = 1; i < arr.length; i++) {
        if (arr[i] < mid) {
            left.push(arr[i]);
        } else {
            right.push(arr[i]);
        }
    }
    return left.concat(mid, right);
}

我们运行一下,看结果:

我们用流程推理一下,果然是第一趟排序的结果。

接下来,我们需要进行第二趟、第三趟……最后一趟排序。

这时我们就要用到递归思想了,我们需要对left和right再进行quickSort方法的调用。

那么显而易见,这么写就顺理成章了:

function quickSort(arr) {
    if (arr.length <= 1) {
        return arr;
    }
    let left = [];
    let right = [];
    let mid = arr[0];
    for (let i = 1; i < arr.length; i++) {
        if (arr[i] < mid) {
            left.push(arr[i]);
        } else {
            right.push(arr[i]);
        }
    }
    return quickSort(left).concat(mid, quickSort(right));
}

好了,这个方法写完了,一切都是那么合理,我们调用一下看看结果:

console.log(quickSort([1, 5, 2, 3, 6, 8, 8, 7, 4]));

和想象中的一样,一切都在计划中:

至此,快速排序就写完了,至少在笔试中这么写足够用了!

分析:

对于快速排序,平均情况的时间复杂度为:O(n*lgn)。

当一个序列基本有序,就个别一个元素位置不对,那么也就是快速排序算法的最差情况,时间复杂度为:O(n*n)。

所以,与其他排序算法相比,快速排序的性价比还是最高的,因此使用也最广泛。

原创地址:https://www.cnblogs.com/ElemSN/p/13503459.html

(0)

相关推荐

  • 美团面试:请手写一个快排,被我怼了!

    大家好,我是田维常,十年码农给你分享后端开发技术,记得关注我. 前面分享8篇,关于2017年,我去上海美团面试遇到的技术问题. 美团面试:熟悉哪些JVM调优参数,幸好我准备过! 美团面试:讲清楚MyS ...

  • Java 查找算法

    Java 查找算法

  • 35.数组.选择排序

    选择排序: 第一轮: 第0个与第1个比, 如果  第0个 > 第1个  那就交换位置,第0个再与第2个比...... 第二轮: 第1个与第2比, ...................直到排序完 ...

  • js常见排序算法实现

    js常见排序算法实现

  • 「排序算法」—图解双轴快排

    首发公众号:bigsai 前言 在排序算法中,快排是占比非常多的一环,但是快排其思想一直被考察研究,也有很多的优化方案.这里主要讲解双轴快排的思想和实现. 首先,双轴快排也是一种快排的优化方案,在JD ...

  • 前端笔试题——数组去重(保姆级手撕)

    引言: 对于传统的前端工程师来说,更多的只是把服务端响应的数据渲染到页面上. 随着前端的不断进化,算法对我们而言也日渐重要,大公司为了优中选优,经常也会用算法题去筛选更优秀的人才. 算法,或许在工作中 ...

  • 超全面!保姆级的噪点插画绘制指南(附实用素材和笔刷)

    什么是噪点插画? 噪点插画还有一个通俗易懂的名字叫颗粒插画,是属于肌理插画的一种. 它由不同大小.不同密度的颗粒组成,当密度低时它是点,当密度高时它还可能成为线与面. 它的特点是能在扁平的画面中用颗粒 ...

  • 实例教学!保姆级的 AI 噪点插画绘制指南(附超多笔刷)

    前言 之前给大家详细的剖析了 PS 的噪点插画教学,我发现很多设计师对噪点插画还是非常感兴趣的,不过在和大家沟通中发现了有些设计师做噪点插画时习惯用 AI 构图,然后再导入 PS 进行噪点添加,相对而 ...

  • 今年手帐哪些值得买?保姆级清单来了

    无论是冲着颜值去 还是只买大牌家的经典款 今年都有新花样 离2022年还有不到3个月,终于到买手帐的时候了. 过去我只有一本用来记工作的本子,当看到社交网络上大神晒出的养眼作品之后,便一发不可收拾,入 ...

  • 想重新装个CAD咋就那么难呢?总是卸载不干净,无法安装?保姆级教程来啦!

    技成电工课堂 学技术,找技成. 98篇原创内容 公众号 CAD可以说是我们电气人必备的一款软件,具有强大的绘图和编辑修改等功能,可以快速.准确.美观的表达出所要画的图纸,广泛应用各个行业领域,我们在使 ...

  • 50道正则表达式笔试题参考答案(第11-20题)

    各位客官姥爷好,欢迎回来.我们在上节给出了前10道正则表达式练习题目和参考答案,相信各位姥爷都有对照着练习.在本节清风将给出第11-20题的参考答案. PS:在各位客官姥爷跟着清风一起完成本系列的练习 ...

  • 我的世界,生存模式快速造房子,保姆级攻略,萌新看一眼就会

    <我的世界>生存模式,别墅无内饰怎么建,建造步骤图文攻略.让我们来打破传统思维模式,一步步建造属于你自己的建筑吧. 我觉得建房子是最有趣的事情了,可以完全按照你自己的想法来建造哦,你觉得呢 ...

  • 原神1.5尘歌壶攻略三:如何伐木效率最高?保姆级攻略来了

    大家好,<原神>1.5尘歌壶攻略又更新啦!前两期攻略,第1期讲了[仙力-信任-负荷-宝钱]的基本知识:第2期攻略是[信任等阶5级之后如何高效制造摆设]: 这第3期尘歌壶攻略,我们来聊聊大家 ...

  • 新疆自驾18天,保姆级攻略

    新疆自驾游总共18天, 这是一场没有任何攻略的暑假旅行. 从北疆到南疆, 从独库公路到沙漠公路, 总行程5500公里, 如果你时间不够, 也可以挑其中一段或几段走, 反正一路都是风景. 行 程 介 绍 ...