【数据结构与算法】腾讯面试官让我模拟快排的执行过程,背好的代码竟无用武之地

2024这一年的Android面经汇总(百度、腾讯、滴滴 各行各样都会淘汰一些能力差的,不仅仅是IT这个行业,所以,不要被程序猿是吃青春饭等等这类话题所吓倒,也不要觉得,找到一份工作,就享受安逸的生活,你在安逸的同时,别人正在奋力的向前跑,这样与别人的差距也就会越来越遥远,加油,希望,我们每一个人,成为更好的自己。BAT大厂面试题、独家面试工具包,资料包括 数据结构、Kotlin、计算机网络、Framework源码、数据结构与算法、小程序、NDK、Flutter本文已被。 阅读详情

我是少侠露飞。学习塑造人生,技术改变世界。

开场白

快速排序号称最优雅的算法之一,在开发中可能用得不算多,但是在一些场景下还是很出色的。最关键的是,各大厂面试官都爱问啊,你说要不要好好掌握吧。
然后就是网上很多快排的代码和讲解,少侠发现很多人自己压根都没搞清楚,代码的边界不清,扔进去一执行就报数组越界异常;要么就是一些人模拟的快排过程都是错的,这让真心想学习的人难免心累。所以少侠决定写一篇记录之,讲解未必是最好的,但代码一定是正确的。

原理及排序过程

原理

分解:快排的核心就是首先选定一个主元pivot,然后将原数组分解成两个子数组A和B,保证A中的结果小于等于pivot,B中的结果都大于等于pivot。
解决:然后针对两个子数组A和B再递归的调用,按照上步分解的逻辑进行。
合并:我们知道,归并排序最后是需要合并子数组的。但在这里,好消息是快排是原址排序,不需要合并。

排序过程

原理不难理解,但是初学者对这个过程可能还是比较模糊。这里少侠就选择一个数组,按照快排的过程一步一步展示给大家。
这里我们选择初始化数组[6,2,3,9,5,8]。
首先选择主元,怎么选呢,可以选择某一索引位置的值,也可以选择多个索引,然后取中位数的值作为主元。这里我们固定选择第一个元素为主元。

  1. 第一次分解的时候pivot=6,分解的目标就是把所有大于等于6的元素移动右边,小于等于6的元素移到左边。然后左指针i从起始位置开始,右指针j从结尾开始,循环的边界就是i<j。初始位置如下图:
    在这里插入图片描述

  2. 每次从右边的指针判定。当右指针的值大于pivot时,右指针左移一位,直到遇到小于等于pivot的值。如下图:
    在这里插入图片描述

  3. 当右指针的值小于pivot时,将当前值赋值给指针i对应的位置,同时i向右移动一位,如下图:
    在这里插入图片描述

  4. 当发生上步的情况(即右指针因小于pivot而发生值的覆盖时候),需要进入该逻辑:就是开始判断左指针的元素值,如果小于pivot,就向右移动一位,直到遇到大于等于pivot的元素。
    在这里插入图片描述
    在这里插入图片描述

  5. 此时i移动到元素值为9的位置,也就是大于pivot,此时需要将此位置的值赋值给j位置并使得指针j左移一位,即:
    在这里插入图片描述

  6. 注意看,此时i=j,左右指针重合,已经不满足循环边界条件(i<j)了,退出循环。但是此时i位置的值才是pivot应该在的位置,所以执行赋值操作将pivot赋值给nums[i]=pivot;得到本次分解的最终结果:
    在这里插入图片描述

  7. 最后再对主元pivot两侧的数组{5,2,3}和{9,8}递归的调用上述过程,得到最终排序结果。

完整实现代码(Java)

    public void quickSort(int[] nums) {
        if (nums == null || nums.length <= 1) {
            return;
        }
        quickSort(nums, 0, nums.length - 1);
    }

    private void quickSort(int[] nums, int left, int right) {
        // 左右指针没有相遇前比较各数据与主元的大小
        if (left < right) {
            // 选择主元值
            int pivot = nums[left];
            // 标记左右指针
            int i = left, j = right;
            // 一趟排序,找到比主元大的数据放在主元右侧,比主元小的值放在基元左侧
            while (i < j) {
                // 从右往左扫描,当前值大于主元时跳过,右指针左移一位
                while (i < j && nums[j] > pivot) {
                    j--;
                }
                // 当走到这里时,意味着当前值左指针和右指针相遇,说明本趟排序结束
                // 也可能是当前数据小于等于主元,此时需要将当前数据赋值给左指针对应的值,并将左指针右移一位
                if (i < j) {
                    nums[i++] = nums[j];
                }
                // 从左往右扫描,当前值小于主元时跳过,左指针右移一位
                while (i < j && nums[i] < pivot) {
                    i++;
                }
                // 当走到这里时,意味着当前值左指针和右指针相遇,说明本趟排序结束
                // 也可能是当前数据大于等于主元,此时需要将当前数据赋值给右指针对应的值,并将右指针左移一位
                if (i < j) {
                    nums[j--] = nums[i];
                }
            }
            // 此时索引i的位置应该就是主元值
            nums[i] = pivot;
            // 左侧按照相同思路递归
            quickSort(nums, left, i - 1);
            // 右侧按照相同思路递归
            quickSort(nums, i + 1, right);
        }
    }

小结

本篇参考书籍《算法导论》。下期还会写篇关于堆排序的博客,敬请期待,也欢迎点赞、关注。咱们下期再见。

58同城2016研发笔试题解析:数据结构与算法核心考点 数据结构与算法是研发工程师的核心内功,也是互联网大厂笔试面试中区分度最高的考察模块。从链表反转、二叉树重建到快排边界、二分查找变种,每一类题目都在检验工程师对底层原理的理解深度和代码实现的严谨性。无论技术栈如何变迁,这些基础知识的应用场景始终贯穿于海量数据处理、索引优化、并发控制等真实工程问题中。本文以58同城2016年研发工程师笔试题为样本,逐题拆解题目背后的考察意图与答题思路,并结合进程线程、TCP握手、SQL聚合等高频考点,帮助读者系统梳理知识盲区,为校招或跳槽打下扎实基础。 阅读详情

相关推荐

腾讯2016研发笔试题深度解析:八大核心考点与避坑指南

在计算机技术面试与校招笔试中,数据结构、C++语言细节、操作系统、计算机网络与数据库等基础知识始终是衡量工程师功底的核心标尺。理解数组与指针的本质区别,掌握链表、二叉树、排序等经典算法的原理与复杂度,是应对笔试的基础能力;而进程线程模型、死锁条件、TCP协议状态机等内容则反映对系统底层机制的认知深度。扎实的基础知识不仅能帮助开发者高效排查线上问题,更能支撑业务场景中的技术选型与架构设计。本文以一套经典的大厂研发工程师笔试题为载体,逐类拆解高频考点、常见易错点与解题思路,结合数组和指针笔试题、linux笔试题

weixin_30500473的博客 530

模拟实现qsort快速排序

模拟实现qsort快速排序

weixin_45476980的博客 418

腾讯研发笔试核心考点拆解:从C++内存布局到算法基础

C++对象内存布局与排序算法稳定性是研发工程师笔试中的高频基础考点。理解虚函数表、指针与数组差异、内存对齐等底层原理,能帮助开发者把握语言运行机制;而排序的稳定性、时间空间复杂度对比,则反映算法选型的工程判断力。这些知识在进程线程并发模型、TCP握手状态分析等系统问题中同样有广泛迁移价值。无论是备战大厂笔试,还是日常代码优化,扎实的计算机基础都能显著提升技术决策质量。本文以腾讯2016研发工程师笔试题为样本,系统拆解C++基础、数据结构、操作系统与网络核心考点,并给出备考策略与避坑指南。

weixin_34292402的博客 349

排序方法之快速排序以及qsort的模拟实现

C语言的排序方法有很多种,最为简单粗暴的当属冒泡排序,除此之外还有许多其他的排序方法,今天着重讲一讲快速排序。

weixin_71020872的博客 556

社招Java后台面经汇总:阿里、字节、腾讯、京东等,进大厂真没那么难!

背景介绍 非科班,项目是一个基于k8s的科研仿真测试平台,本科双非,硕士985。 非常感谢这些公司给的面试机会,面试过程很有收获。阿里、腾讯、字节、京东均通过,美团是因为时间冲突,自己也有了offer,就终止了流程,唯一面试挂了的就是猿辅导,紧张了topk都写懵了,写了个快排切分的方法面试官并不满意。 面试的经验就是,不用紧张,就是一份工作而已,并不是生活的全部。基础知识就能说多少就说多少,有些面试官不会给反馈,就马上接着问,而有些要求高的,就是变通地问。关于算法题,拿到题目之后别急着写,先思考,然后把思路

weixin_53224039的博客 1279

北京研一在读,首次参加社招成功拿到了腾讯、字节、快手、滴滴的offer,分享一下我的面经

一:前言 大家好,我是洲洲,目前北京门头沟学院研一在读, 趁考试周之前的两个星期,找了一波实习,历时半个月左右 踩过很多坑,也有裸面被怼的哑口无言的时候 总的来说,体验是找大厂实习真的很难 投很多岗位就是没有后续,石沉大海,相信不止我一个人这样 😥 😥 作者为大家整理了很多资料!包括一线大厂Java面试题总结+各知识点学习思维导+一份300页pdf文档的Java核心知识点总结! 这些资料的内容都是面试时面试官必问的知识点,篇章包括了很多知识点,其中包括了有基础知识、Java集合、JVM、多线程并发、spr

m0_60614141的博客 480

快速排序过程模拟

快速排序是以左端数据基准,从右向左找小于它的数,从左向右找大于它的数,找到后进行交换并继续查找,如果两各指针重合,就与基准数据交换,并在基准数据的左右重复以上过程。#include&lt;iostream&gt; #include&lt;cstdio&gt; #include&lt;cstring&gt; using namespace std; const int MAXN = 10005; ...

someone_and_anyone的博客 1046

腾讯2013研发笔试复盘:吃透经典题,打通大厂面试底层逻辑

校招和社招的笔试准备,与其盲目刷海量新题,不如回头吃透几套经典真题。技术面试中反复出现的数据结构、C++内存模型、操作系统并发、网络协议等核心概念,本质上都在考察工程师对基础原理的理解深度。通过经典题目复盘,既能梳理知识盲区,也能训练从抽象建模到工程落地的完整思维链。这套方法论不仅适用于笔试应试,对日常编码中的内存管理、性能优化和问题排查同样有指导意义。从基础概念出发,结合大厂历年真题的考察逻辑,帮助求职者建立系统化的复习路径,真正提升面试竞争力。

weixin_33857230的博客 414

快速排序Java实现(手动模拟)

基本思想: 将待排记录分割成独立的两部分,其中第一部分记录的关键字总比第二部分记录的关键字小,再缩小范围对每一部分进行快排,直到原记录为有序序列 实例过程演示:temp=a[low]=17 17 23 16 3 25 12 40 34 28 9 54 45 ...

qq_34517044的博客 405

腾讯四大技术方向面经汇总:前端Java C++ Go面试套路与核心考点

大厂技术面试的本质,是考察候选人对基础原理的理解深度和工程实践能力。无论前端、Java、C++还是Go,底层都共享操作系统、网络、数据结构与数据库等知识底座。系统化梳理语言特性、并发模型、内存管理、框架原理和算法设计,是提升面试通过率的关键路径。无论是暑期实习、秋招提前批还是社招跳槽,掌握一套可复用的面经整理方法,能帮助求职者从海量八股文中聚焦高频考点,比如Java的OOM排查、C++的constexpr版本演进与智能指针、Go的GMP调度与channel关闭原则,以及前端的事件循环与浏览器渲染链路。结合真

weixin_30697239的博客 327

ROS中costmap_converter插件的配置与使用

在学习TEB算法的过程中,作者提供了一个插件用于转换代价地图,原始的代价地图是由栅格地图中单元格组成,用于表示障碍物,但单元格占用的计算资源较大,故采用插件将单元格转换成点,线,多边形表示。 插件激活 rospack plugins --attrib=plugin costmap_converter 配置cfg文件 在导航配置文件下,新建costmap_converter_params.yaml #######################################################

weixin_42621524的博客 5905

用快排的思维模拟实现“万能“的冒泡排序--“Qsort“

1.先来看一看刚学习c语言时,那时我们写的冒泡排序 那时因为能力有限,把代码写死了,只能对整形的数组进行排序。 2.那么问题来了,以后想要对字符数组,浮点型数组,结构体数组进行排序的时候,我们应 该如何设计代码呢? 改进: 运用快速排序的思路(快排的函数:qsort) 参照优快云:qsort 解析: 参数1:void*类型的指针,可以接收任何类型的数组的地址; 参数2:接收数组的长度; 参数3:数组中一个元素的字节长度; 参数4:...

xaiobit_hl的博客 573

从CAD到Web:高效转换STEP/IGES模型为GLB格式的实践指南

本文详细介绍了如何将工业设计中的STEP/IGES模型高效转换为Web友好的GLB格式。通过PythonOCC和gltf-pipeline等工具链,实现从CAD到Web的无缝转换,大幅提升模型加载速度和展示效果。文章包含实战案例、优化技巧和常见问题解决方案,帮助开发者快速掌握3D模型转换技术。

weixin_29072299的博客 507

2016年腾讯研发笔试题深度解析:算法与C++基础考点全覆盖

算法与数据结构是技术面试中衡量工程师基础能力的核心标尺,也是解决复杂工程问题的底层工具。理解数据结构的特性、算法复杂度的分析方法及C++底层实现原理,能帮助工程师在系统性能调优和线上问题排查中做出更精准的取舍。实际业务中,快排思想可优化海量数据排序,动态规划模型能抽象业务逻辑,栈与哈希表则支撑着函数调用和频次控制等高频场景。通过剖析经典笔试题的解题思路与隐藏评分点,能够系统梳理算法思维与工程实践能力。2016年腾讯研发工程师笔试题正是一套覆盖算法、数据结构、C++与操作系统的经典题目,至今仍极具参考价值,值

cuiji1279的博客 363

DeepSeek+Dify之一安装部署

DeepSeek添加知识库

yilvyangguang520的博客 1544

SerDes电路的PCB仿真设计规则及策略

SerDes的PCB设计中,重点工作是使用3D 电磁 (EM) 场求解器,进行过孔结构优化,包括 BGA的扇入和扇出区域以及布线的过孔区域,并且,利用连接器供应商提供加密的 3D 模型,进行连接器和 PCB 的级联仿真,最终获取系统级的通道性能参数,如插入损耗、回波损耗、串扰和模式转换、阻抗曲线等,如果发现任何缺陷,再进行进一步优化,这一过程中,推荐进行拆分仿真,以提高设计效率。

一只豌豆象的博客 2192

腾讯2017校招C++开发工程师笔试题解析:考点与备考策略

大厂校招笔试历来是检验开发者计算机基础与工程实践能力的试金石。无论C++后台开发还是算法岗位,笔试通常覆盖语言特性、数据结构、操作系统、网络协议等核心知识,而看似简单的题目往往隐藏着对底层原理的深层考察。理解对象内存模型、STL容器机制、进程通信与TCP状态转换等概念,不仅能帮助应对选择题,更是实际开发中排查性能瓶颈与系统异常的关键能力。海量数据处理、高并发服务等真实场景,均需将算法思维(如Top K问题)与系统知识融会贯通。透过腾讯2017校招开发工程师笔试试卷的逐题拆解,可以看到考点背后的命题逻辑——C

weixin_34150830的博客 467

NX二次开发PK获取对象类型

PK_ENTITY_ask_class(),获取对象类型建议用这个函数,比较通用,包含所有对象类型,可以替代UF_MODL_ask_edge_type(),UF_MODL_ask_body_type(),UF_MODL_ask_face_type()等函数。

qq_39541524的博客 827

腾讯校招笔试题解析:从数据结构到系统基础的全栈能力体检

在技术面试与校招笔试中,数据结构与算法始终是考察候选人逻辑思维与编码基本功的核心模块,而操作系统、计算机网络、数据库等知识则决定了工程师排查问题与系统设计的上限。理解这些基础概念的原理与应用场景,不仅是应对大厂笔试的关键,更是后端开发日常工作中不可或缺的能力。本文从二叉树遍历、动态规划建模、TCP握手机制、C++虚函数、MySQL索引等通用技术点切入,结合腾讯2017年开发工程师笔试试卷的题型分布与答题策略,剖析大厂笔试背后的考察逻辑,并给出模拟训练、时间分配、错题复盘等实践方法,帮助读者系统提升基础能力与

weixin_34408624的博客 505

基于matlab的阈值分割的车牌定位识别系统

车牌自动识别模块是现代社会智能交通系统(ITS)的重要组成部分,是图像处理和模式识别技术研究的热点,具有非常广泛的应用。车牌识别主要包括以下三个主要步骤:车牌区域定位、车牌字符分割、车牌字符识别。本案例通过对采集的车牌图像进行灰度变换、边缘检测、腐蚀及平滑等过程进行车牌图像预处理,并由此得到一种基于车牌颜色纹理特征的车牌定位方法,最终实现了车牌区域定位。车牌字符分割是为了方便后续对车牌字符进行匹配,从而对车牌进行识别。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 969

【硬件的单元测试 UT 3】PCIe 3.0及信号完整性测试方法

PCIe标准自从推出以来,1代和2代标准已经在PC和Server上逐渐普及,用于满足高速显卡、高速存储设备对于高速数据传输的要求。出于支持更高总线数据吞吐率的目的,PCI-SIG组织在2010年制定了PCIe 3.0,即PCIe 3代的规范,数据速率达到8Gbps。

qq_43416206的博客 1415

腾讯客户端开发LeetCode高频题解析与面试技巧

数据结构与算法是计算机科学的核心基础,尤其在客户端开发中直接影响应用性能。哈希表通过键值映射实现O(1)查询,在解决两数之和等问题时展现优势;二叉树遍历则支撑着UI层级处理等场景。腾讯面试特别关注算法在移动端的实践应用,如快速排序的内存优化、链表操作与Android消息机制的关联。掌握这些技术不仅能提升代码效率,更是通过大厂面试的关键。本文基于2026年腾讯客户端真实面试数据,详解68道高频考题的解题思路与易错点,特别包含哈希表应用、二叉树遍历等热门前端技术考点。

weixin_30667649的博客 361

基于 transformer、lstm、LSTM多特征的交通流量预测 完整数据代码 超全项目 本科硕士毕设卓卓有余

基于 transformer、lstm、LSTM多特征的交通流量预测 完整数据代码 超全项目 本科硕士毕设卓卓有余

4655

2016腾讯研发工程师笔试题详解:算法、网络与系统设计复盘

数据结构与算法是研发工程师笔试的核心基石,链表反转、二分查找、动态规划等经典题型不仅考察编码熟练度,更检验对内存模型与状态转移本质的理解。操作系统中的进程线程、死锁条件,网络中的TCP三次握手、TIME_WAIT状态,同样是衡量基础是否扎实的关键维度。掌握这些核心概念的原理与工程实践价值,能帮助求职者在真实笔试中快速定位考点、规避常见陷阱。对于准备大厂校招或希望自查技术功底的开发者而言,通过一套典型真题进行系统性复盘,是高效检验知识盲区并提升答题策略的实用方法。本文以2016年腾讯研发工程师笔试题目为样本,

weixin_34159110的博客 391

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

从2017腾讯校招笔试题看大厂开发岗考察重点与备考策略

计算机基础是互联网大厂校招笔试的硬门槛,其中数据结构与算法、操作系统、计算机网络、数据库等核心知识构成了考察的主体。理解内存对齐、虚函数表、TCP三次握手、B+树索引等原理,不仅帮助解决笔试中的客观题,更能提升真实工程场景下的问题分析能力。从曾经的腾讯校招笔试卷出发,梳理C/C++内存管理、排序与链表操作、LRU缓存设计等高频考点,可以发现大厂命题始终强调基本功与工程实践的深度结合。系统化掌握这些经典内容,对准备后端开发、AI应用开发等岗位的笔试与面试都有直接价值。这份2017年的老试卷,依然是检验基础扎实

weixin_34055787的博客 376

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

腾讯2016研发工程师笔试题解析:从基础到算法的核心考点

研发岗位笔试往往聚焦数据结构与算法、C/C++内存管理、操作系统与TCP协议等基础能力。这些知识看似简单,却是区分候选人的关键。理解数组与指针的退化规则、const/static/volatile语义、虚拟内存分页机制,掌握链表反转、二叉树遍历、动态规划状态转移等核心算法套路,并熟悉TCP三次握手与TIME_WAIT原理,是应对大厂笔试的必备技能。此类基础功底不仅用于笔试答题,更直接影响工程实践中代码的健壮性和性能优化。通过经典题型训练,从概念到原理再到实际应用,可以系统提升技术素养,也为后续深入理解分布式

weixin_33767813的博客 390

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

上一篇: 我为什么不建议开发中使用UUID作为MySQL的主键
下一篇: 【Java多线程手写代码】(一):启动两个线程交替顺序打印奇偶数
少侠露飞
博客等级 码龄9年 214粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值