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

我的后端Java面经、八面阿里,已拿offer!(阿里飞猪、阿里健康、阿里菜鸟)心得感悟! 阿里巴巴面试 自我介绍 讲一个项目,我说的区块链,然后围绕着区块链说了一堆,比如说我没回答上来的,有没有做性能测试,还有orderer节点都有什么服务 最大堆概念 排序算法比较排序时间复杂度,如何查找最大的1000个数 有没有什么排序算法能够小于nlogn的 阿里巴巴菜鸟网络面试 面试岗位 菜鸟网络的JAVA开发岗 面试体验 工作内容为Java后台的业务开发,还有一部分C++工作,聊了大概1个... 阅读详情

 算法是程序的灵魂,一个优秀的程序是可以在海量的数据中,仍保持高效计算。目前各大厂的面试要求也越来越高,算法肯定会要去。如果你不想去大厂,只想去小公司,获取并不需要要求算法。但是你永远只能当一个代码工人,也就是跟搬砖的没区别。可能一两年后你就会被淘汰。 如果不想永远当个代码工人,就在业余时间学学数据结构和算法。

今天就来分享一个朋友阿里四面挂了的排序算法题912. 排序数组, 排序数组这道题本身是没有规定使用什么排序算法的,但面试官指定需要使用归并排序算法来解答,肯定是有他道理的。

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

MESA Monitor

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

归并排序(递归版)

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

1. 分:先递归分解数组成子数组

2. 治:将分阶段得到的子数组按顺序合并

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

MESA Monitor

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

MESA Monitor

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

class Solution {
    public int[] sortArray(int[] nums) {
        sort(0, nums.length - 1, nums);
        return nums;
    }

    // 分:递归二分
    private void sort(int l, int r, int[] nums) {
        if (l >= r) return;

        int mid = (l + r) / 2;
        sort(l, mid, nums);
        sort(mid + 1, r, nums);
        merge(l, mid, r, nums);
    }


    // 治:将nums[l...mid]和nums[mid+1...r]两部分进行归并
    private void merge(int l, int mid, int r, int[] nums) {
        int[] aux = Arrays.copyOfRange(nums, l, r + 1);

        int lp =l, rp = mid + 1;

        for (int i = lp; i <= r; i ++) {
            if (lp > mid) {                // 如果左半部分元素已经全部处理完毕
                nums[i] = aux[rp - l];
                rp ++;
            }  else if (rp > r) {          // 如果右半部分元素已经全部处理完毕
                nums[i] = aux[lp - l];
                lp ++;
            } else if (aux[lp-l] > aux[rp - l]) { // 左半部分所指元素 > 右半部分所指元素
                nums[i] = aux[rp - l];
                rp ++;
            } else {                        // 左半部分所指元素 <= 右半部分所指元素
                nums[i] = aux[lp - l];
                lp ++;
            }
        }
    }
}
复制代码

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

归并排序(迭代版)

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

MESA Monitor

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

class Solution {
    public int[] sortArray(int[] nums) {
        int n = nums.length;
        // sz= 1,2,4,8 ... 排序
        for (int sz = 1; sz < n; sz *= 2) {
            // 对 arr[i...i+sz-1] 和 arr[i+sz...i+2*sz-1] 进行归并
            for (int i = 0; i < n - sz; i += 2*sz ) {
                merge(i, i + sz - 1, Math.min(i+sz+sz-1, n-1), nums);
            }
        }
        return nums;
    }

  	// 和递归版一样
    private void merge(int l, int mid, int r, int[] nums) {
        int[] aux = Arrays.copyOfRange(nums, l, r + 1);

        int lp =l, rp = mid + 1;

        for (int i = lp; i <= r; i ++) {
            if (lp > mid) {
                nums[i] = aux[rp - l];
                rp ++;
            }  else if (rp > r) {
                nums[i] = aux[lp - l];
                lp ++;
            } else if (aux[lp-l] > aux[rp - l]) {
                nums[i] = aux[rp - l];
                rp ++;
            } else {
                nums[i] = aux[lp - l];
                lp ++;
            }
        }
    }
}
复制代码

总结

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

麻烦各位大佬 支持一下下 一键三连 和评论下另外小编这里整理了最新的算法面试题 以及左神的书籍 免费发送给同学 

来自本科双非的逆袭,四面阿里,三面快手,成功拿到了阿里的意向书 前言 这是一篇迟到的面经,因为面完后比较忙一直没有时间整理,凭借自己脑中的印象回忆实习面试题用来回馈 作者为大家整理了很多资料!包括一线大厂Java面试题总结+各知识点学习思维导+一份300页pdf文档的Java核心知识点总结! 这些资料的内容都是面试时面试官必问的知识点,篇章包括了很多知识点,其中包括了有基础知识、Java集合、JVM、多线程并发、spring原理、微服务、Netty 与RPC 、Kafka、日记、设计模式、Java算法、数据库、Zookeeper、分布式缓存、数据结构等等。 全部的面试 阅读详情

相关推荐

文本→图像→视频:AIGC跨模态转换全流程解析

本文旨在系统性地解析AIGC领域中跨模态内容生成的技术原理和实现方法,特别聚焦于从文本到图像再到视频的完整转换流程。跨模态表示学习的基本原理文本到图像生成的核心技术图像到视频转换的关键算法端到端跨模态生成系统的构建方法实际应用场景和性能优化策略背景介绍:建立基本概念和知识框架核心概念:解析跨模态转换的关键技术和原理算法细节:深入讲解文本到图像、图像到视频的核心算法数学模型:提供必要的数学基础和公式推导项目实战:通过完整案例展示实现过程应用场景:探讨技术的实际应用可能性。

AI天才研究院 1353

java 桶排序

java桶排序

weixin_43931625的博客 415

基因家族快速鉴定指南:Windows平台下的HMMER实战解析

本文详细解析了在Windows平台下使用HMMER工具进行基因家族快速鉴定的完整实战流程。通过手把手指导,从软件获取、数据准备到模型构建与序列搜索,帮助生物信息学新手无需Linux环境,即可高效完成bZIP转录因子等家族的鉴定工作,大幅降低分析门槛。

weixin_29255731的博客 460

常用排序算法总结

概述 在计算器科学与数学中,一个排序算法(英语:Sorting algorithm)是一种能将一串数据依照特定排序方式进行排列的一种算法。本文将总结几类常用的排序算法,包括冒泡排序、选择排序、插入排序、快速排序和归并排序,分别使用Java代码实现,简要使用图例方式介绍其实现原理。 算法原理及实现 1、冒泡排序 原理图 理解 通过重复地遍历要排序的列表,比较每对相邻的项目,并在顺序...

阿里云云栖号 1233

从Zemax到Speos:HUD设计数据无缝迁移避坑指南(含STEP文件精度验证)

本文详细介绍了从Zemax到Speos的HUD设计数据无缝迁移方法,重点解决Zernike曲面参数保真、虚拟厚度设置和坐标系对齐等核心问题。通过STEP文件精度验证和工程化解决方案,帮助工程师避免数据迁移中的常见陷阱,提升HUD系统设计效率。适用于Ansys Zemax和Ansys Speos用户,优化光学性能验证流程。

h6i7j8的博客 1064

一文帮你彻底搞懂ARM Debug Interface之SWD(转)

ARM的文档写的已经很好了,但是关于上电以后的第一时间应该怎么操作,依然写的不够清晰,导致我第一次用的时候还是费了一些周折。今天做一个详细的梳理,希望能够帮助到更多的朋友。BTW, ARM_Cortex-M0/3 DesignStart系列会持续更新,只是中间可能会穿插其他知识点。SWD是Serial Wire Debug的简称,翻译成中文是”串行线调试”。

2302_79847220的博客 6861

关于2015阿里移动推荐算法大赛的总结(二)——推荐算法

推荐系统并不是新鲜的事物,在很久之前就存在,但是推荐系统真正进入人们的视野,并且作为一个重要的模块存在于各个互联网公司,还是近几年的事情。 随着互联网的深入发展,越来越多的信息在互联网上传播,产生了严重的信息过载。如果不采用一定的手段,用户很难从如此多的信息流中找到对自己有价值的信息。

Sin_Geek成长の迹 1万+

AUTOSAR TcpIp模块 以太网配置开发2

someip协议之tcpIp协议

汽车电子电气 1085

阿里推荐算法介绍

博主作为一名应届生,进入阿里做推荐算法,得益于对tensorflow的了解。 在阿里的日子里主要做基于word2vec的召回算法,doc2vec的排序算法,表征技术REPL的纯ID类排序算法,基于DNN的长短期记忆模型和追剧模型。 受益颇多。

csuzhaoqinghui的博客 2343

第1章 环境准备

本章是 Kubernetes 高可用集群部署的前置基础环境配置,所有节点必须严格按顺序执行。主要内容包括:节点规划(IP、角色、配置要求)、VMware 克隆节点环境清理(解决 MAC 地址和主机名冲突)、统一工作目录创建、主机名与 hosts 解析配置、系统基础升级、防火墙与 swap 关闭、内核模块加载(overlay、br_netfilter、ip_vs)、网络参数优化(IP 转发、桥接过滤)、时间同步配置等。Ubuntu 24.04 内核 6.8+ 原生支持 eBPF 和 IPVS,无需手动升级内核

幸福街--linux技术分享 210

STM32 使用SYN6288语音模块

本篇文章带大家学习一下SYN6288语音模块,这个模块可以用于车载设备,语音电子书等众多产品当中,而且这个模块支持多种编码格式,GB2312,GBK等字符编码格式。SYN6288语音合成模块是一种语音合成设备,其可实现文字转语音功能,将输入的文字信息通过内部的处理和合成,输出相对应的语音信息。SYN6288模块具有语音合成质量高、输出音质好、使用方便等特点,因此广泛应用于语音播报、语音提示、语音识别、智能家居、智能家电、安防监控等领域。支持多语言:包括中文、英文、日文、韩文等多种语言。

m0_49476241的博客 2万+

什么?一道排序算法竟然征服了阿里的面试官?

写在前面 学习很难,克服惰性。每天学一点,不会的就少一点。 养成习惯很重要,先从点赞开始吧!关注[程序员之道],程序员之路不再迷茫 大厂光环,闪耀万里,谁不想拥有BAT的一段光环。 最近有位朋友参加阿里的视频面试,道哥觉得他的面试过程很神奇,因为全程都是围绕一个排序算法?而且这位同学获得了面试官的充分认可。我觉得很有趣,有必要分享出来。 下面请搬好板凳做好,中途不要走神离开哦,好,我们的故事...

9488

模型预测控制(MPC)解析(二):单输入单输出系统

在上一篇中,为了便于说明,预测控制系统采用单输入单输出系统为例进行设计。由于系统模型使用的是状态空间方程,于是可以很容易的将这种设计方法可以扩展到多输入、多输出系统。

行者无疆的博客 8223

四面阿里,看看你都会吗

最近一个朋友跟我说,现在面试太难了,再也不是以前那种随便背几个面试题然后就能拿到offer的时候了。最近朋友准备换工作面试了阿里,然后和我交流了下他遇到的一些面试题,然后我整理了一下,然后就分享给有需要的朋友们顺便也查漏补缺一下。 一面 1.开始是自我介绍; 2.HashMap的实现原理,什么是hash碰撞,怎样解决hash碰撞? 3.ConcurrentHashMap的原理,与HashTable的区别? 4.HashSet和TreeSet的区别以及底层实现原理 5.HashMap中存key-value,v

寒泉 6万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

三面头条+四面阿里+五面腾讯拿offer分享面经总结,最终入职阿里

前言 一路走来也遇到很多困难,也踩了很多坑,同时我自己也探索了很多的学习方法,总结了很多心得体会,并且对面试这块也做了一些研究和相应的准备。 这里分享面试阿里、头条、腾讯的经过以及一些总结 四面阿里 面试岗位是研发工程师,直接找蚂蚁金服的大佬进行内推,参与了阿里巴巴中间件部门的提前批面试,一共经历了四次面试,拿到了口头offer。 一面: 自我介绍 项目中做了什么,难点呢。 Java的线程池说一下,各个参数的作用,如何进行的。 Redis讲一下 分布式系统的全局id如何实现。用zookeeper如何实现的

weixin_47066028的博客 1417

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

阿里健康四面,阿里飞猪技术两面经历分享,已进阿里飞猪

这次打电话又面试了很久,问了很多经典的问题,但很多又记得很模糊了,尴尬,本来都准备过的,可以答得很流利的。就写到这了,也算是给这段时间的面试做一个总结,查漏补缺,选择了阿里飞猪,祝自己好运吧。这次是到阿里健康里面去面试,面试官应该是级别较高的人,总体体验还是很好的。面试官电话来的很晚,基本是要睡觉了,可以感觉出来阿里的工作不轻松呀。

jjc4261的博客 1622

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

四面阿里Java岗,头都秃了,终于拿下了Offer!

前言 “金九银十”就快结束了,小编看到了许多朋友在焦急的准备跳槽面试,所以今天小编将一位小伙伴四面阿里Java岗的过程分享给大家,希望能对即将面试的小伙伴有所帮助。 一面: 1、开始是自我介绍 2、HashMap的实现原理,什么是hash碰撞,怎样解决hash碰撞? 3、ConcurrentHashMap的原理,与HashTable的区别? 4、HashSet和TreeSet的区别以及底层实现原理 5、HashMap中存key-value,value有重复但是都是Comparable类型可比较;怎样根据

weixin_47955802的博客 1884

四面阿里看看你都会吗

最近一个朋友跟我说,现在面试太难了,再也不是以前那种随便背几个面试题然后就能拿到offer的时候了。最近朋友准备换工作面试了阿里,然后和我交流了下他遇到的一些面试题,然后我整理了一下,然...

架构师小秘圈 398

三面阿里,四面京东,終拿offer!Java面经分享!

本人某985计算机专业硕士,在校期间主要研究方向是大数据和分布式系统,有3个开源项目贡献经历,2段BAT级别实习经历。从去年9月开始准备秋招,最终通过阿里三面技术面+HR面,京东四面(含2轮技术交叉面),最终同时拿到阿里P6和京东T7的offer。

IT_1024的博客 1900

阿里四面你都知道吗?

阿里四面你都知道吗? 最近一个朋友跟我说,现在面试太难了,再也不是以前那种随便背几个面试题然后就能拿到offer的时候了。最近朋友准备换工作面试了阿里,然后和我交流了下他遇到的一些面试题,然后我整理了一下,然后就分享给有需要的朋友们顺便也查漏补缺一下。 一面 1.开始是自我介绍; 2.HashMap的实现原理,什么是hash碰撞,怎样解决hash碰撞? 3.ConcurrentHashMap的原理,与HashTable的区别? 4.HashSet和TreeSet的区别以及底层实现原理 5.HashMap

126

朋友四面阿里Java岗的详细流程和面试问题。

最近一个朋友跟我说,现在面试太难了,再也不是以前那种随便背几个面试题然后就能拿到offer的时候了。最近准备换工作面试了阿里,和我交流了下他遇到的一些面试题,然后我整理了一下,就分享给有需要的朋友们顺便也查漏补缺一下。 一面 1.开始是自我介绍; 2.HashMap的实现原理,什么是hash碰撞,怎样解决hash碰撞? 3.ConcurrentHashMap的原理,与HashTable的区别? 4.HashSet和TreeSet的区别以及底层实现原理 5.HashMap中存key-value,value有

程序员Monkey的专栏 2923
上一篇: 靠这本,在某宝花了399大洋的宝典,熬夜七天,吊打面试官,终进大厂
下一篇: 如何在二三线城市月薪过万(一)看完这篇后端简历优化,包你面试不断
奇迹摘星w
博客等级 码龄6年 1844粉丝 189原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值