当前位置: 首页 > news >正文

6.22面试问题【1】长链表排序选择归并还是快排

先问快排和归并的思路?

  • 快速排序
    快速排序的基本思想是通过一个划分操作,将待排序的数组分为两个部分,其中一部分的所有数据都比另一部分的所有数据要小,然后再递归地对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
    步骤如下:
    选择基准值(Pivot):从数组中选择一个元素作为基准值,选择方法有多种,如选择第一个元素、最后一个元素、中位数等。
    分区操作(Partitioning):重新排列数组,比基准值小的元素放在基准值的前面,比基准值大的元素放在基准值的后面。分区结束后,基准值所处的位置就是其最终排序后的位置。
    递归排序:递归地将基准值前后的两部分数组进行排序。
    快速排序的平均时间复杂度为O(n log n),但最坏情况下的时间复杂度为O(n^2)。
  • 归并排序
    归并排序的基本思想是将待排序的数组分成若干个子序列,先让每个子序列有序,再让子序列段间有序。归并排序采用了经典的分治策略,分为“分”和“治”两个过程。
    步骤如下:
    分:将数组从中间分成前后两部分,然后递归地对这两部分分别进行归并排序。
    治:将两个排序好的子序列合并成一个最终的排序序列。
    归并过程需要额外的空间来合并两个有序数组,这是归并排序的一个特点。
    归并排序的时间复杂度始终为O(n log n),它比快速排序的最坏情况要好,但是由于其需要额外的存储空间,空间复杂度为O(n)。

链表适合归并排序而不是快速排序的原因主要有以下几点:

内存访问模式:快速排序的效率主要来源于引用的局部性,计算机硬件在这里得到了优化,因此访问彼此相邻的内存位置往往比访问分散在内存中的内存位置更快。然而,链表单元格经常分散在内存中,所以访问相邻的链表单元格没有局部性的好处。因此,快速排序的一个大的性能优势在链表排序中就被削弱了。
空间复杂度:快速排序是原地排序,不需要创建任何辅助数组来保存临时值。这在数组排序中是一个巨大的优势,因为分配和释放辅助数组所需的时间是显而易见的。然而,对于链表来说,归并排序的链表算法并不需要任何额外的辅助存储空间。
排序效率:归并排序往往更快,因为它更平均地将列表一分为二,并且在每次迭代中进行归并比执行分区步骤所做的工作更少。
参考:点击

我不太理解为什么快排依赖局部性原理,我更偏向于的解答:

快速排序和归并排序的操作特性不同:
快速排序:快速排序涉及大量的元素交换(如果是数组)和需要随机访问元素以进行分区操作。在链表上执行这些操作相对低效,因为每次访问或找到一个特定的节点都需要从头开始遍历链表。
归并排序:归并排序主要是分治和合并操作,这些操作对链表来说非常自然和高效。分治操作通过递归将链表分成两半,不需要额外空间;合并两个有序链表也非常高效,只需要调整节点的指针。归并排序不需要随机访问链表节点,这使得它在链表上的实现比快速排序更为适合。

这题有待商榷。
链表两种排序代码
数组两种排序代码

相关文章:

  • 动手学深度学习(Pytorch版)代码实践 -卷积神经网络-14模型构造
  • 在C#中对 JSON进行序列化和反序列化处理
  • 物联网协议应用
  • 【GO-OpenCV】go-cv快速配置
  • Spring的自动注入(也称为自动装配)
  • 分享excel全套教程速成,高效人士的Excel必修课,附视频课程!
  • 基于SpringBoot+Vue在线考试报名系统设计和实现(源码+LW+调试文档+讲解等)
  • 【SCAU数据挖掘】数据挖掘期末总复习题库简答题及解析——下
  • 使用 DISPATCHERS 进行 Blueprint 之间的通信
  • Python二级考试试题
  • Python高效内存访问,memoryview这个神器你值得拥有!
  • zlib库的交叉编译记录
  • 【Redis】java客户端(SpringData和jedis)
  • Kotlin 实战小记:No-Arg 引用解决 No constructor found的问题
  • Ubuntu24使用kubeadm部署高可用K8S集群
  • 深入了解以太坊
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • es6要点
  • flutter的key在widget list的作用以及必要性
  • HTML中设置input等文本框为不可操作
  • Java 内存分配及垃圾回收机制初探
  • javascript 哈希表
  • Javascript编码规范
  • node 版本过低
  • PHP变量
  • SpiderData 2019年2月23日 DApp数据排行榜
  • 前嗅ForeSpider采集配置界面介绍
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 组复制官方翻译九、Group Replication Technical Details
  • # Spring Cloud Alibaba Nacos_配置中心与服务发现(四)
  • #Linux(权限管理)
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (7) cmake 编译C++程序(二)
  • (二开)Flink 修改源码拓展 SQL 语法
  • (每日一问)操作系统:常见的 Linux 指令详解
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (四)c52学习之旅-流水LED灯
  • (四)软件性能测试
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (一)基于IDEA的JAVA基础10
  • (转)nsfocus-绿盟科技笔试题目
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • *算法训练(leetcode)第四十七天 | 并查集理论基础、107. 寻找存在的路径
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .net6 webapi log4net完整配置使用流程
  • .NET性能优化(文摘)
  • .php文件都打不开,打不开php文件怎么办
  • @SentinelResource详解
  • [ Linux 长征路第五篇 ] make/Makefile Linux项目自动化创建工具
  • [\u4e00-\u9fa5] //匹配中文字符
  • [ANT] 项目中应用ANT
  • [C++]多态