我的知乎账号进击的steve - 知乎
根据我面试过几乎所有各大互联网一二线公司的经验:
面试基本考这四种:1.快速排序 2.堆排序 3.归并排序. 4冒泡排序
按考察频率排:
1. 快速排序,理由:难度适中,朗朗上口,细节可提问的地方多,优化挖深空间大,易于筛选基础不牢靠的人。
2. 堆排序,理由:堆排序是最重要的一种排序之一,且堆排序效率真的很高
3. 归并排序,理由:归并排序虽然应用场景稍微少一点,但是对于链表排序优于快排和堆排。
4. 冒泡排序,理由:比较简单,但是考这道题花不了多长时间,类似于高考前几道总要出点基础题的感觉。还有种可能,担心快排堆排被背烂了,就考这个。
常用考法:一般来说面试官不会直接跟你说:你给我写个快速排序,给我写个堆排序,而是模拟一个场景。
问题1: 写一个程序,查看慢查询日志,返回一系列操作和他们执行的时长,我要查找执行时间第5长的是哪个?
问题2:写一个程序,几百万个用户的粉丝数量,我要返回一个粉丝数量超越95%用户粉丝数量的用户和粉丝数量?
解答:遇到这类问题就要马上想到这实际上就是一个top-k问题,而top-k问题的最优解是堆排序。但是快速排序也能求出top-k那为什么堆排序更优呢?因为当待排序列表基本有序的情况下快速排序的时间复杂度会退化为接近O(n^2),但是堆排序的时间复杂度最坏情况下都小于等于O(nlogn)
不要以为遇到这些题手撕完堆排序就完事了hhh 面试官大多不会就此善罢甘休的,基本上都会追问:算法的时间复杂度是多少? 为什么不用快速排序? 堆排序的其他优点?
假如你先用了快速排序,面试官会说那如果这个列表99%有序, 请问你快速排序的时间复杂度是多少(灵魂拷问)?不过如果你基础扎实,准确分析出快排在高度有序的时间复杂度变化和导致变化的细节(双指针遍历全列表),那反而是个更加分的项。
问题3:我有一个未排序的单链表,你帮我设计一个排序算法,要求时间复杂度控制在O(nlogn)以内。
解答:这个时候可能萌新会马上想到堆排序,但实际上这个问题用堆排序做会相当复杂,因为堆排序中交换元素和递归处理依赖的是数组具有索引这个性质,而单链表是没有索引的,所以堆排序来排序链表交换和递归操作的时候都需要遍历不能直接定位;但是归并排序就适用于链表排序,因为归并排序只需要维护指针保存每段链表的头和尾,而链表的拼接时间复杂度仅为O(1), 所以归并排序可以稳定让链表排序时间复杂度在O(nlogn)以内。
问题4:归并排序还有哪些优点?归并排序适合用于数组排序吗?归并排序有哪些缺点?
解答:除了较高的时间效率,归并排序还是一种稳定排序;但是归并排序不适合用于数组排序,因为数组拼接由于要重置索引,所以数组拼接时间复杂度为O(n)。此外归并排序需要O(n)的空间复杂度,堆排序空间复杂度O(1),快排O(logn)
问题5:快速排序有哪些优化思路?
(这个问题我先占个坑,未完待续,大致思路是三路快排)
问题6:一组数,用最简单的思路找到第3大的数。
解答:这里面试官强调思路简单,可想而知并不是想让你写堆排序,快速排序,而是想考 冒泡排序 和 插入排序了。
问这个面试官可能会问:冒泡排序,插入排序时间复杂度? 他们是否是稳定排序等问题。插入和冒泡排序平均时间复杂度均为O(n^2), 最好的情况下都能达到O(n), 两者均为稳定排序。
实际应用中,快排对于数据量大,数据分布随机的平均效率高于堆排序,但如果数据大部分有序发现快排明显退化的时候会切换到堆排,快排递归到比较小的数据量的时候为了节约递归产生的空间,也会切换成插入排序
快速排序及其优化超详细解答+代码(真正理解)6 赞同 · 0 评论文章正在上传…重新上传取消https://zhuanlan.zhihu.com/p/384708371