阿里四面,居然栽在一道排序算法上

简介: 大家好,我是指北君。前两天有童鞋发消息给指北君哭诉阿里四面挂了,据了解,面试过程中该童鞋表现得很不错,所以最后面试官出了道简单题"912. 排序数组"放放水,但指定使用归并排序算法,但该读者因为细节问题运行case始终过不了,最终收到感谢信。

所以在面试中,越是简单的题,就越要答好,不然会给面试官留下基础不扎实的印象。好了,回归到面试题上来,排序数组这道题本身是没有规定使用什么排序算法的,但面试官指定需要使用归并排序算法来解答,肯定是有他道理的,如果指北君是面试官,大概率也会要求读者使用归并排序,为啥呢?在解答之前我们先看看有哪些排序算法。

我们知道,排序算法有很多,大致有如下几种:

1.jpg

其中归并排序应该是使用的最多的几种之一,Java中Arrays.sort()采用了一种名为TimSort的排序算法,就是归并排序的优化版本。归并排序自身的优点有二,首先是因为它的平均时间复杂度低,为O(N*logN);其次它是稳定的排序,即相等元素的顺序不会改变;除了这两点优点之外,其蕴含的分治思想,是可以用来解决我们许多算法问题的,这也是面试官为什么要指定归并排序的原因。好了,废话不多说,我们接下来具体看看归并排序算法是如何实现的吧。


1. 归并排序(递归版)


归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治策略,即分为两步:分与治。

  1. 分:先递归分解数组成子数组
  2. 治:将分阶段得到的子数组按顺序合并

我们来具体看看例子,假设我们现在给定一个数组:[6,3,2,7,1,3,5,4],我们需要使用归并算法对其排序,其大致过程如下图所示:

2.jpg


阶段可以理解为就是递归拆分子序列的过程,递归的深度为log2n。而治的阶段则是将两个子序列进行排序的过程,我们通过图解看看治阶段最后一步中是如何将[2,3,6,7]和[1,3,4,5]这两个数组合并的。

3.jpg

图中左边是复制的临时数组,而右边是原数组,我们将左右指针对应的值进行大小比较,将较小的那个数放入原数组中,然后将相应的指针右移。比如第一步中,我们比较左边指针L指向的4和右指针R指向的1,R指向的1小,则把1放入原数组中的第一个位置中,然后R指针向右移动。后面再继续,直到左边临时数组的元素都按序覆盖了右边的原数组。最后我们通过上图再结合源码来看看吧:


4.png5.png

我们可以看到,分阶段的时间复杂度是logN,而合并阶段的时间复杂度是N,所以归并算法的时间复杂度是O(N*logN),因为每次合并都需要对应范围内的数组,所以其空间复杂度是O(N);


2. 归并排序(迭代版)


上面的归并排序是通过递归二分的方法进行数组切分的,其实我们也可以通过迭代的方法来完成这步,看下图:


6.jpg

其因为数组,所以我们直接通过迭代从1开始合并,其中sz就是合并的长度,这种方法也可以称为自底向上的归并,其具体的代码如下


7.png8.png


3.  总结


好了,归并算法就介绍完了,指北君再来总结一下:

归并排序是一种十分高效的排序算法,其时间复杂度为O(N*logN)。归并排序的最好,最坏的平均时间复杂度均为O(nlogn),排序后相等的元素的顺序不会改变,所以也是一种稳定的排序算法。归并排序被应用在许多地方,其java中Arrays.sort()采用了一种名为TimSort的排序算法,其就是归并排序的优化版本。

我是指北君,操千曲而后晓声,观千剑而后识器。感谢各位人才的:点赞、收藏和评论,我们下期更精彩!

相关文章
|
达摩院 算法 决策智能
阿里达摩院研发了一款运筹优化算法开发平台
使用数学规划技术时,需要运用运筹学的知识分析问题、数学建模和开发程序来计算。平台式的开发环境,可以集成多款优化求解算法和数据处理软件,易于使用,能提高开发的效率,帮助快速将优化技术应用于业务。
阿里达摩院研发了一款运筹优化算法开发平台
|
12月前
|
缓存 算法 架构师
阿里P9架构师终于把毕生心血而成的分布式高可用算法笔记开源了
说在前面的话 分布式系统无处不在。 一台计算机内部多个互联的处理器组成了一个分布式系统,它们通过“一致性缓存”算法使每个处理器核心看到相同的数据。近三十年来,随着互联网的发展,越来越多的互联网后台系统采用计算机集群的方式来应对海量请求和数据的需求,这个计算机集群也是分布式系统。 为了简化分布式系统的开发,出现了很多为开发者提供分布式框架的开源项目,例如Apache基金会旗下的ZooKeeper项目就是一个应用广泛的分布式框架。 同时,国内也有很多关于如何使用这些分布式框架来搭建应用的书籍,它们极大地推动了分布式系统在国内的应用。我们不仅要知道如何使用这些现成的分布式框架来搭建应用,而且应
|
5月前
|
存储 算法
【数据结构与算法】【腾讯阿里链表面试题】算法题--链表易懂版讲解
【数据结构与算法】【腾讯阿里链表面试题】算法题--链表易懂版讲解
|
负载均衡 监控 算法
【阿里二面面试题】说说你对 Raft 算法的理解?
【阿里二面面试题】说说你对 Raft 算法的理解?
772 0
【阿里二面面试题】说说你对 Raft 算法的理解?
|
5月前
|
算法 搜索推荐 Java
太实用了!阿里内部强推的超全Java算法学习指南,已被彻底征服
算法和数据结构一直以来都是程序员的基本内功。 数据结构可以看作是算法实现的容器,通过一系列特殊结构的数据集合,能够将算法更为高效而可靠地执行起来。
太可惜了,四面字节跳动,我的offer竟被一道“算法题”给拦截了
算法,在行业里越来越重要,一线互联网公司也非常注重算法,所以在面试时基本上都有涉及到。字节跳动是出了名的爱问算法题,几乎每一面都要问到算法。实际上,现在很多公司都会问算法,尤其是对于应届生来说,要求更高,所以想要进大厂,搞定算法是很重要的。
|
5月前
|
算法 NoSQL Java
2023年阿里高频Java面试题:分布式+中间件+高并发+算法+数据库
又到了一年一度的金九银十,互联网行业竞争是一年比一年严峻,作为工程师的我们唯有不停地学习,不断的提升自己才能保证自己的核心竞争力从而拿到更好的薪水,进入心仪的企业(阿里、字节、美团、腾讯.....)
|
10月前
|
存储 人工智能 算法
|
11月前
|
算法 网络协议 Java
48W字?GitHub上下载量破百万的阿里:图解Java、网络、算法笔记
Java基础这个东西,无论在哪个公司都被看得尤为重要,而面试中关于基础的问题也是层出不穷。所以基础可以说是重中之重,当你的基础打牢了,其他的也就没有那么重要了。
|
12月前
|
Kubernetes 算法 关系型数据库
No.3 腾讯,阿里,字节,优科面经(上-算法篇)
No.3 腾讯,阿里,字节,优科面经(上-算法篇)
下一篇
无影云桌面