面试官:我们继续来聊聊关于数据结构与算法,美团面试你能写一个快速排序?请手(说话的同时,把我简历反过来,快排递给我一支笔,被怼意思就是美团面试叫我在自己的简历背后写) 菜鸟我:什么意思?这里写吗?(指着简历) 面试官:嗯 菜鸟我:不会 面试官:好吧,今天面试就到这里 菜鸟我:(心里很火,请手劳资的快排简历,想在劳资简历上写代码?被怼)沙雕 面试官:(回头看了一眼,一脸懵逼) 想想自己还是美团面试太年轻了,换着是请手现在就不是这样了。写就写嘛,快排反正不就是被怼一张纸而已。图片 其实,美团面试快排说简单嘛,请手估计很多人也手写不出来,快排说难吗也有很多人你能现场手写几种方式。 菜鸟我,当年还是能手写一种,毕竟面试前我刚好刻意的准备过“默写快排”。 下面,我们就来分析分析----快速排序。 来自百科: 快速排序由C. A. R. Hoare在1962年提出。它的基本思想是云服务器:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以[递归]进行,以此达到整个数据变成有序序列。 这概念理解起来 还是蛮费劲儿的。 可以这么理解: 快速排序是冒泡排序的改进版,整个过程就在拆拆补补,东拆西补或西拆东补,一边拆一边补,直到所有元素达到有序状态。 核心思想: 先从数列中取出一个数作为基准数,然后进行大小分区; 分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边; 再对左右区间重复第二步,直到各区间只有一个数,排序完成。 下面先通过图文形式一步一步进行拆解。 拿[4,1,6,2,9,3]这个数组举例。 第一遍遍历: 目前数组顺序为[3,1,2,4,9,6]。 下一步: 右边同理……避免视觉疲劳就不一一描述了,可看下面动态演示图。 下面,我们使用Java语言来实现前面的快排案例: 输出结果: 代码实现,建议结合前面的动图,理解起来就更简单了。亿华云计算 快排写法还有几种,感兴趣的可以自行查找一下,另外也可以看看维基百科中,快排是怎么介绍的。 时间复杂度: 最坏情况就是每一次取到的元素就是数组中最小/最大的,这种情况其实就是冒泡排序了(每一次都排好一个元素的顺序) 这种情况时间复杂度就好计算了,就是冒泡排序的时间复杂度:T[n] = n * (n-1) = n^2 + n; 最好情况下是O(nlog2n),推导过程如下: (递归算法的时间复杂度公式:T[n] = aT[n/b] + f(n) ) https://img2018.cnblogs.com/blog/1258817/201903/1258817-20190326191158640-601403776.png 所以平均时间复杂度为O(nlog2n) 空间复杂度: 快速排序使用的空间是O(1)的,也就是个常数级;而真正消耗空间的就是递归调用了,因为每次递归就要保持一些数据: 最优的情况下空间复杂度为:O(log2n);每一次都平分数组的情况 最差的情况下空间复杂度为:O( n );退化为冒泡排序的情况 所以平均空间复杂度为O(log2n) 默认取第一个元素为轴心点(轴心点的确认区分了 “快速排序法”和“随机排序法”)两种算法,而随机排序则随机rand一个元素为轴心点; 如果两个不相邻元素交换,可以一次交换消除多个逆序,加快排序进程。 最后再说说,其实你觉得快速排序在工作中有用吗?工作近十年的我真的没用过,但我知道这个快排的思路。如果面试前不准备,我反正是肯定写不出来的,你呢?背景
实现案例
2. 快速排序法全流程
3.代码实现
4.复杂度分析
5. 快速排序法总结
后记