常见面试题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)缓存未命中,增加内存访问成本。快排和归并则没有这个问题
目录
相关文章
|
2月前
|
存储 数据可视化 容灾
开发PACS系统的技术难点解析:从数据管理到性能优化
开发PACS系统面临多重技术与合规挑战:海量影像数据的高效存储与分层管理、高并发下的实时调阅性能、DICOM标准的深度兼容、专业级图像处理与Web化可视化、与HIS/RIS/EMR系统的无缝集成、7×24小时高可用与数据安全,以及严格的医疗设备注册与网络安全认证。需融合存储架构、协议解析、临床流程与法规合规,构建稳定可靠的临床级系统,技术壁垒极高。
174 3
|
30天前
|
负载均衡 安全 应用服务中间件
常见面试题18
正向代理代表客户端发起请求,隐藏客户端身份,用于访问控制与隐私保护;反向代理代表服务器接收请求,实现负载均衡与安全防护;CDN通过全球节点加速内容分发;Nginx可作反向代理实现轮询、权重等负载均衡策略;CAP定理指出分布式系统无法同时满足一致性、可用性与分区容错性。
52 4
|
2月前
|
Kubernetes 网络协议 调度
Kubernetes权威指南-深入理解Pod & Service
Pod是Kubernetes最小调度单元,将多个紧密协作的容器组合为一个逻辑主机,共享网络、存储与IP。通过YAML定义容器、卷、健康检查等配置,支持静态Pod、Init容器、ConfigMap等高级特性,并借助Service实现稳定的服务发现与负载均衡,Ingress则提供七层流量路由,构建高效、可靠的微服务架构。
|
2月前
|
负载均衡 算法 调度
基于遗传算法的新的异构分布式系统任务调度算法研究(Matlab代码实现)
基于遗传算法的新的异构分布式系统任务调度算法研究(Matlab代码实现)
135 11
|
2月前
|
存储 SQL 关系型数据库
常见面试题11
MySQL索引主要使用B+tree结构,具有层级少、检索快、支持范围查询等优点。InnoDB中聚簇索引将数据存于叶子节点,主键为默认索引;二级索引则存储主键值,需回表查询完整数据。创建索引需遵循最左前缀、避免类型转换、函数操作等原则,并通过explain分析执行计划,防止索引失效,提升查询效率。
50 0
|
2月前
|
Java 应用服务中间件
从Tomcat 9.X到Tomcat 10. X以上
如果您原来使用的是Tomcat 9.X,现在您要升级到Tomcat 10. X以上,需要做如下设置
85 0
|
2月前
|
机器学习/深度学习 算法 BI
汽车雷达系统的干扰缓解:现状调查与未来趋势——论文阅读
本文系统综述了汽车雷达干扰缓解技术的最新进展,提出基于物理域避免、主动避免、反应式信号重建和被动调制技术的四类划分方法,深入分析各类策略的原理、优劣及实施挑战,并强调跨学科合作与监管协同对未来发展的关键作用。
226 4
汽车雷达系统的干扰缓解:现状调查与未来趋势——论文阅读
|
28天前
|
NoSQL API 调度
常见面试题20
分布式锁适用于共享资源互斥、防止重复操作、控制并发流量等场景,常见于超卖防控。可通过数据库、Redis(如Redisson)、ZooKeeper实现,其中Redisson适合高并发,ZooKeeper保证强一致性。
45 5
|
2月前
|
数据采集 机器学习/深度学习 搜索推荐
MIT新论文:数据即上限,扩散模型的关键能力来自图像统计规律,而非复杂架构
MIT与丰田研究院研究发现,扩散模型的“局部性”并非源于网络架构的精巧设计,而是自然图像统计规律的产物。通过线性模型仅学习像素相关性,即可复现U-Net般的局部敏感模式,揭示数据本身蕴含生成“魔法”。
134 3
MIT新论文:数据即上限,扩散模型的关键能力来自图像统计规律,而非复杂架构
|
1月前
|
XML SQL Java
常见面试题15
Spring Boot配置优先级:命令行参数 > 系统属性 > application.properties > .yml > .yaml;自动配置基于@Import与条件注解,SpringBoot3使用xxx.imports替代spring.factories。自定义starter需分离starter与autoconfigure模块。MyBatis支持XML或注解映射结果集,参数传递可用@Param或直接传对象/Map。
93 4