当你的才华还撑不起你的野心时,你应该静下心去学习 。

面试现场,终于到了紧张刺激的手撕代码环节,你忐忑的心情随着考官的一句话归于平静。

你简直不敢相信眼前这个穿着格子衬衫,牛仔裤角有些发白,头发在风中有些凌乱但仍然难掩老程序员气质的面试官竟然问出这么水的问题,你有些诧异的眼神瞥了一下他,他只是推了推镜框,厚厚的镜片埋下的眼睛连正眼都没有看你。你压抑住自己兴奋激动的心情,“老子早写了八百遍了”,但还是装出若有所思的样子,大约过了十分钟,你把代码甩到了他的脸上,不好意思不好意思,以为在梦里, 现实中你恭恭敬敬地交出了如下代码,并幻想着面试官向你投来赞许的目光,后生可畏呀:

眼看面试官一愣,门口的保安拿着对讲机已经蠢蠢欲动,另外一只手隐隐约约拿了样东西,像是砖头,但比砖头略大。你迟疑了几秒,“不好意思不好意思,拿错了,应该是这个“,你挠了挠头,抱歉的样子还是一如往常帅气逼人。

void QuickSort_Core(vector<int> &A, int Left, int Right){if(Left>=Right) {return;}int pivot = A[0]; int i=Left;int j=Right-1;while(1){while(A[++i] < pivot){}   //从左往右扫,碰到大于pivot的值,就记录下来while(A[--j] > pivot){}   //从右往左扫,碰到小于pivot的值,就记录下来if(i<j){        //如果没有扫完整个数组就停下,说明有值需要交换swap(A[i],A[j]);        }else{break;}}swap(A[i],A[Right-1]);  //把pivot插入指针i,j相遇点QuickSort_Core(A,Left,i-1);QuickSort_Core(A,i+1,Right);
}
int main(){vector<int> A = {};int N = A.size();Quick_Sort(A,0,N-1);cout<<"{"; return 0;
}

你以为自己大功告成,结果面试官追问:

”快排采用的是分治的策略,根据选定的pivot,即主元,通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,就可以达到整个数据变成有序序列。“

你的回答熟练的让人心疼,但是面试官好像并没有什么回应。

意料之中,ez。

”是这样的,快速排序是现实应用中最快的排序算法,它的时间复杂度可以达到

,这是因为它采用了“分而治之”的思想。同时需要
的空间复杂度,这是他递归调用需要的额外栈空间。“

回答完这道,面试官终于抬起了头开始正眼看你啦,你觉得自己的自信心达到了新的高度。至此,一切还在你的掌控之中。

面试官又扶了扶眼镜,问道:

你开始碰到了之前没碰到的问题了,有点慌,但是应场能力还是可以的,你只是用余光警惕地瞟了一眼门口的保安,然后赶紧回答道: ”我觉得我写的这个代码 特别完美一不小心咋还说出心里话了捏 在处理本身就是有序的数组时可能会重复排序递归的子数组。“

你开始有了一丝慌张,

?

,你不是很自信的答道。

“emmmmm那个,应该是嵌套递归相关,emmm”,

幸运的是,老练的面试官还是给了你一些帮助,你踉踉跄跄终于写出如下推导: 假设我递归的时候,每次都选取数组第一个值作为pivot,那么如果一个数组如果本身就是有序的,比如1到N,我选取1做pivot,其他数和他比较分为两个子集,再递归,但是这里,化成的子集就是2到N,又重复,(近似等于没有分治)。

推导式可以写成,

好,面试官看你踉踉跄跄答出来了,于是决定还能再 虐虐你 多交流一下,于是问道,

你知道一定是和pivot的选取有关,所以第一个念头就是,随机数。

“可以在数组中,随机取一个吧” 你答道,

看你面露难色,面试官又说道,

你有了思路,就开始写起了代码,经过一段时间的苦思冥想,你得到如下的pivot选取办法,

int Median3(vector<int> &A, int Left, int Right){int center = (Left+Right)/2;if(A[Left] > A[center]){        //两两比较,将三个数排序swap(A[Left],A[center]);}if(A[center] > A[Right]){swap(A[Right],A[center]);}if(A[Left] > A[center]){swap(A[Left],A[center]);}swap(A[center],A[Right-1]);    //取出中间那个并和最右边倒数第二个调换位置,这样只需要考虑Left+1到Right-2之间的排序return A[Right-1];  //返回值当作pivot
}

你甚至耍了点小聪明,把数组的前一个和后两个都一起排序好了。但是,到了现在,快排问法的多种多样已经让你始料未及。

你认为如果比较的话会有很多多余的操作,所以你回答应该跳过。

到这里,你已经明显感觉到压力。

这时候,你觉得面试官的格子衫和牛仔裤是那么迷人,连隐隐可见的头油都显得光彩夺目,发出关爱智障的光。

你收起了你的痴汉脸,赶紧端正了下,答道:

“快速排序的问题可能就在于它是使用递归的,有的时候效率比较低”

“因为它是要占用大量系统的堆栈,有很多push和pop的操作,如果数据规模不大的话,是不需要递归的,可以直接用简单排序,比如插入排序就可以了。”

说罢,你擦了擦汗,看着快排已经问了将近一个小时,你似乎对快排有了新的理解。

???说好的最后一个问题呢???

为了读者的一个赞 呸, 为了这个offer,拼了。于是,你又花了些时间,以上面的代码为基础,得到了完整版快速排序,这里的threshold就是你设立的阈值,数组低于这个值时,就可以用插入排序了。

#include <iostream>
#include <vector>using namespace std;
void swap(int &A,int &B){int temp = B;B = A;A = temp;
}int Median3(vector<int> &A, int Left, int Right){int center = (Left+Right)/2;if(A[Left] > A[center]){        //两两比较,将三个数排序swap(A[Left],A[center]);}if(A[center] > A[Right]){swap(A[Right],A[center]);}if(A[Left] > A[center]){swap(A[Left],A[center]);}swap(A[center],A[Right-1]);    //取出中间那个并和最右边倒数第二个调换位置,这样只需要考虑Left+1到Right-2之间的排序return A[Right-1];
}void QuickSort_Core(vector<int> &A, int Left, int Right){if(Right-Left>=threshold){   //满足就快排if(Left>=Right) {return;}int pivot = Median3(A, Left, Right); //此时数组的最左边和最右边的值已经确定,不需要再考虑int i=Left;int j=Right-1;while(1){while(A[++i] < pivot){}   //从左往右扫,碰到大于pivot的值,就记录下来while(A[--j] > pivot){}   //从右往左扫,碰到小于pivot的值,就记录下来if(i<j){        //如果没有扫完整个数组就停下,说明有值需要交换swap(A[i],A[j]);        }else{break;}}swap(A[i],A[Right-1]);  //把pivot插入指针i,j相遇点QuickSort_Core(A,Left,i-1);QuickSort_Core(A,i+1,Right);}void Quick_Sort(vector<int> &A, int N){QuickSort_Core(A, 0, N-1);}else{   //不满足就插入排序Insert_Sort(A[remainingpart],Right-Left+1);}
}int main(){vector<int> A = {};int N = A.size();Quick_Sort(A,N);cout<<"{";for(auto e:A){cout<<e<<",";
}cout<<"}";    return 0;
}

看着写满C++代码的白纸,你长舒了一口气,起身离开。

经过门口时,保安向你会心一笑,默默放下了手中比砖头还厚的《Java核心技术》,喃喃说道:Java才是世界上最好的编程语言

回到学校,同学问你面试如何,

“没啥,面了个快排。”

“那么简单?这波血赚。”


创作不易,你的鼓励是我创作的动力,如果你有收获,点个赞吧

python快速排序最简单写法_面试官:来,这位精神小伙,简简单单写个快速排序吧...相关推荐

  1. python快速排序最简单写法_漫画:最最最最最简单的选择排序

    public static int[] selectionSort(int[] array){ if (array.length == 0) return array; for(int i =0;i& ...

  2. python怎么接收udp报文_面试官:说说UDP和TCP的区别及应用场景

    上一篇聊完一文彻底搞懂 TCP三次握手.四次挥手过程及原理 这次聊聊TCP和UDP的区别和场景 TCP/IP 中有两个具有代表性的传输层协议,分别是 TCP 和 UDP.来看看传输层位于OSI七层协议 ...

  3. xml中else if写法_面试官:优化代码中大量的if/else,你有什么方案?

    一个快速迭代的项目,时间久了之后,代码中可能会充斥着大量的if/else,嵌套6.7层,一个函数几百行,简!直!看!死!人! 这个无限循环嵌套,只是总循环的一部分...我已经绕晕在黄桷湾立交 仔细数了 ...

  4. 如何把class里的vector结构体memcpy出来_面试官:请说出线程安全的 ArrayList 有哪些,除了Vector...

    以下环境是 JDK 1.8 ArrayList 的初始容量 面试官:你看过 ArrayList 的源码? Python 小星:看过 面试官:那你说下ArrayList 的初始容量是多少? Python ...

  5. arraylist 后往前遍历_面试官:请说出线程安全的 ArrayList 有哪些,除了Vector

    以下环境是 JDK 1.8 ArrayList 的初始容量 面试官:你看过 ArrayList 的源码? Python 小星:看过 面试官:那你说下ArrayList 的初始容量是多少? Python ...

  6. postman发送报文时请求时间超时因为什么_面试官说不要再问我三次握手和四次挥手是什么了...

    三次握手和四次挥手是各个公司常见的考点,也具有一定的水平区分度,也被一些面试官作为热身题.很多小伙伴说这个问题刚开始回答的挺好,但是后面越回答越冒冷汗,最后就歇菜了. 见过比较典型的面试场景是这样的: ...

  7. python 等待其他线程执行完_面试官:如何让线程顺序执行,join,还有其他办法吗?...

    面试官:如让线程顺序执行? 我:使用Thread的join方法. 面试官:除了join还有别的办法吗? 我:目前只用过join. 面试官:哦,那你了解CountDownLatch吗? 我:不了解,没使 ...

  8. 人生苦短,我用python,这些可以吊打面试官的题目你值得拥有!

    前言:期待的是可以检验自己学习的成功:苦逼的是怎么又有东西没记住,但我们依然每天坚持一遍.一遍又一遍指导记住为止."一个人能驾驭自律的能量,就会变得势不可挡,就像大自然的力量.不再需要替毫无 ...

  9. sqlserver2008未将对象引用设置到对象的实例_面试官:ThreadLocal 的内存泄漏是弱引用导致的,你确定?...

    面试官:ThreadLocal 了解吗? Python 小星:线程局部变量,多线程下能保证各个线程的变量相对独立于其他线程的变量. 面试官:那你说下它是如何保证线程隔离的? Python 小星:每个线 ...

最新文章

  1. 编写程序实验两个数的加减结果的判断_力学实验1:实验基础与实验仪器
  2. Express结合Webpack的全栈自动刷新
  3. 《网易编程题》分苹果
  4. systrace html空白,Android性能优化之Systrace工具介绍(一) _ Systrace生成的trace.html打开空白或者打不开的解决办法...
  5. 状态开关按钮(ToggleButton)及按钮(Swich)的使用
  6. 【windows 10】+【OpenCV3.4.1】+【opencv_contrib3.4.1】编译:
  7. Echart极坐标间隔显示-单类目轴
  8. LeetCode 4Sum 4个数之和
  9. android 画布线条加粗,Android 对TextView添加删除线,下划线,加粗,斜体等效果
  10. 浏览器分辨率使用排名以及不同分辨率下的网页测试
  11. vs2017官方下载地址
  12. 听说 2022 年个税改革了,这是咋回事?
  13. JS学习笔记之内置对象 4.21
  14. 雷军再次承诺:小米9下周二开放购买
  15. 项目成本管理软件能为你做什么?
  16. Java调用GSview来打印PDF
  17. 微型计算机系统的框架,微型计算机系统原理及应用
  18. 认真学习《天善学院数据分析师八大能力培养课程》
  19. 用企业微信机器人做交互式前端-输出
  20. 从WEB 2 0到GAME 2 0

热门文章

  1. 设计师经常逛的网站?
  2. APP时间界面设计模板,可临摹学习的好素材
  3. .anonymous springsecurity需要登陆嘛_springSecurity之java配置篇
  4. java 匿名初始化_Java:双括号初始化 /匿名内部类初始化法
  5. 论网络安全(观直播后感)
  6. C++判断函数执行效率方法封装
  7. QT创建相应文件夹在指定目录下
  8. 模式搜索的KMP算法详解与C语言代码实现
  9. DPDK单生产者入队单消费者出队
  10. 疫情下远程办公的第二天,躺下来刷刷手机