常见面试题09

简介: 排序算法分为比较类(如快排、归并、堆排)和非比较类(如计数、桶、基数)。快排平均最快但不稳定,归并稳定且复杂度恒定,插入排序适合小规模或近有序数据。工业级常混合多种算法优化性能。

请介绍一下你知道的排序算法有哪些

初级答法

常见的排序算法有:冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等

进阶答法

排序算法大致可分为两类:

  • A. 基于比较的排序算法
  • B. 非比较排序算法

比较排序算法有:快排、归并、堆排序、插入排序等

非比较排序算法有:计数排序、桶排序、基数排序等

比较排序算法中

  • 快排、归并、堆排序能够达到 $$O(n \cdot \log{n})$$的(平均)时间复杂度
  • 而插入排序的(平均)时间复杂度是 $$O(n^2$$
  • 但并不是说复杂度高的算法就差,这要看数据规模和数据有序度,例如
  • 数据量小,或是有序度高的数据就适合用插入排序
  • 同样是数据量大的数据排序,如果数据的有序度高,归并优于快排
  • 快排虽然是比较排序中最快的算法,但若是分区选取不好,反而会让排序效率降低
  • 工业级的排序都是混合多种排序算法,例如 java 排序的实现就是混合了插入、归并与快排,不同的数据规模、不同场景下切换不同的排序算法

至于计数、桶、基数可以达到进一步让时间复杂度降至$$O(n$$,当然这与被排序数字的位数、范围等都有关系。

冒泡排序与其它排序算法比较

  • 选择
  • 时间复杂度:都是 O(n^2)
  • 交换
  • 冒泡在相邻元素两两比较时,遇到逆序元素,立刻就要进行交换
  • 选择可以每轮的结束时,把最大元素交换到已排序区
  • 选择的交换次数(或者说元素的移动次数)更少
  • 稳定性
  • 冒泡是稳定排序
  • 选择是不稳定排序
  • 对有序数组排序
  • 冒泡可以优化,时间复杂度能降至O(n)
  • 选择不能优化
  • 插入
  • 时间复杂度:都是 O(n^2)
  • 交换
  • 插入的交换次数更少
  • 稳定性
  • 二者都是稳定排序算法
  • 对有序数组排序
  • 都可以只比较一轮,无需交换,时间复杂度达到$$O(n$$
  • 与剩余的排序算法比较
  • 时间复杂度不在同一级别,无可比性

选择排序与其它排序算法比较

  • 同级别像插入、冒泡等都是稳定排序算法,而选择属于不稳定排序算法
  • 它们的时间复杂度都一样,平均时间复杂度都是O(n^2),不咋地
  • 选择排序还应当与堆排序比较
  • 相似点:都是每轮选出最大元素,交换至已排序区域
  • 不同点:数据结构不同,选择排序底层是线性结构,而堆排序结构是大顶堆,这就造成每次选择的效率是堆结构更高

插入排序的适用场景

  1. 数据规模较小
  2. 数据有序度高
  3. 链表排序

插入排序与其它排序算法比较

  1. 插入排序优于时间复杂度同级的冒泡、选择,它既是稳定排序算法、又能对已排序数据达到$$O(n$$的复杂度
  2. 插入排序还经常与希尔排序比较,希尔排序可以看作插入排序的增强版
  3. 工业排序实现中,会结合插入、快排、归并做混合排序

归并排序与其它排序算法比较

常见的是把它与快速排序比较

  1. 相同点是,二者都基于分治思想,平均时间复杂度都能达到O(n * log{n})
  2. 分治细节不同
  1. 归并是分到分无可分、在合并的过程中逐渐有序
  2. 快排是在每次分区时,就将比基准点小的换到左边分区,比基准点大的换到右边分区,不需要后面合的过程
  1. 稳定性不同
  1. 归并是稳定的
  2. 快排是不稳定的
  1. 时间复杂度有差异
  1. 归并,时间复杂度总会保持 O(n * log{n})
  2. 快排,若基准点选择不好,两个分区划分不均匀,则会退化至 O(n^2)

归并排序能做哪些优化

  1. 一种常见的优化是,如果切分后的小数组元素较少,可以切换为插入排序,而不必一定要等到元素个数切分至1
  2. 归并排序通常用递归实现,可以考虑修改为迭代实现,减少递归开销
  3. 归并排序可以改进为并行归并算法,提升多核 cpu 下的排序能力

快速排序还有哪些优化手段

  1. 分区不均衡会让快排效率变低。使用随机数作为基准点,避免选中最值基准点导致的分区不均衡
  2. 如果基准点的重复值较多,则原来算法中的分区效果也不好,要想办法让这些重复值也分布均匀
  3. 当分区内元素少到一定程度,可以切换为插入排序

堆排序与其它排序算法比较

  • 堆排序同级别排序方法有快排、归并等,它们的时间复杂度都是 O(n * log{n})
  • 堆排序中的下潜操作涉及到父元素与它的左右孩子交换,数据量较大时,父元素距离它的孩子较远,这样可能会造成(CPU)缓存未命中,增加内存访问成本。快排和归并则没有这个问题
目录
相关文章
|
3月前
|
存储 数据可视化 容灾
开发PACS系统的技术难点解析:从数据管理到性能优化
开发PACS系统面临多重技术与合规挑战:海量影像数据的高效存储与分层管理、高并发下的实时调阅性能、DICOM标准的深度兼容、专业级图像处理与Web化可视化、与HIS/RIS/EMR系统的无缝集成、7×24小时高可用与数据安全,以及严格的医疗设备注册与网络安全认证。需融合存储架构、协议解析、临床流程与法规合规,构建稳定可靠的临床级系统,技术壁垒极高。
247 3
|
3月前
|
Kubernetes 网络协议 调度
Kubernetes权威指南-深入理解Pod & Service
Pod是Kubernetes最小调度单元,将多个紧密协作的容器组合为一个逻辑主机,共享网络、存储与IP。通过YAML定义容器、卷、健康检查等配置,支持静态Pod、Init容器、ConfigMap等高级特性,并借助Service实现稳定的服务发现与负载均衡,Ingress则提供七层流量路由,构建高效、可靠的微服务架构。
|
存储 NoSQL Java
蚂蚁金服Java研发岗二面:redis 常见数据结构以及使用场景分析
redis简单来说 就是一个数据库,不过与传统数据库不同的是 redis 的数据是存在内存中的,所以存写速度非常快,因此 redis 被广泛应用于缓存方向。另外,redis 也经常用来做分布式锁。redis 提供了多种数据类型来支持不同的业务场景。除此之外,redis 支持事务 、持久化、LUA脚本、LRU驱动事件、多种集群方案。所以在面试中我们经常可以看到redis的身影,今天给大家带来一道redis的面试真题以及解析,后面会给大家分享今年来redis常考试的一些真题。
316 0
|
3月前
|
负载均衡 算法 调度
基于遗传算法的新的异构分布式系统任务调度算法研究(Matlab代码实现)
基于遗传算法的新的异构分布式系统任务调度算法研究(Matlab代码实现)
196 11
|
3月前
|
机器学习/深度学习 数据采集 算法
【SCI二区IEEE复现】基于混合有限集模型预测控制(FCS-MPC)的模块化多电平换流器(MMC)整流电路仿真模型(Simulink仿真实现)
【SCI二区IEEE复现】基于混合有限集模型预测控制(FCS-MPC)的模块化多电平换流器(MMC)整流电路仿真模型(Simulink仿真实现)
231 6
|
3月前
|
消息中间件 存储 Java
常见面试题02
本内容介绍MQ的应用场景、交换机模式、消息不丢失机制、延迟消息处理及消息挤压解决方案,涵盖RabbitMQ的确认机制、持久化、消费者配置及实际项目应用。
132 1
|
3月前
|
存储 SQL 关系型数据库
常见面试题11
MySQL索引主要使用B+tree结构,具有层级少、检索快、支持范围查询等优点。InnoDB中聚簇索引将数据存于叶子节点,主键为默认索引;二级索引则存储主键值,需回表查询完整数据。创建索引需遵循最左前缀、避免类型转换、函数操作等原则,并通过explain分析执行计划,防止索引失效,提升查询效率。
74 0
|
2月前
|
数据库 微服务
常见面试题19
BASE理论提出“基本可用、软状态、最终一致性”,是分布式系统中对CAP定理的实践妥协。相比强一致的刚性事务(ACID),它属于柔性事务,强调高可用与最终一致,适用于Seata等分布式事务方案中的AT、TCC、SAGA模式,而非传统2PC的强一致性。
72 7
|
3月前
|
数据采集 机器学习/深度学习 搜索推荐
MIT新论文:数据即上限,扩散模型的关键能力来自图像统计规律,而非复杂架构
MIT与丰田研究院研究发现,扩散模型的“局部性”并非源于网络架构的精巧设计,而是自然图像统计规律的产物。通过线性模型仅学习像素相关性,即可复现U-Net般的局部敏感模式,揭示数据本身蕴含生成“魔法”。
179 3
MIT新论文:数据即上限,扩散模型的关键能力来自图像统计规律,而非复杂架构
|
3月前
|
存储 网络协议 关系型数据库
常见面试题10
HTTP是超文本传输协议,基于TCP,规定客户端与服务器通信规则。常见请求方式有GET和POST,区别在于参数传递、安全性和用途。HTTPS通过SSL加密更安全,但耗资源。常用状态码如200成功、404未找到、500服务器错误。转发在服务端完成,重定向由浏览器发起两次请求。MySQL中char定长、varchar变长;事务具ACID特性,隔离级别解决并发问题。
105 3