常见面试题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)缓存未命中,增加内存访问成本。快排和归并则没有这个问题
目录
相关文章
|
1天前
|
Java
Java基础学习day05-作业
本文为Java基础学习第五天作业,通过五个案例练习类与对象的定义、构造方法、set/get方法及成员方法的应用。涵盖女友、学生、教师、手机和电影等类的设计与测试,强化面向对象编程基础。
15 2
|
1天前
|
存储 数据可视化 容灾
开发PACS系统的技术难点解析:从数据管理到性能优化
开发PACS系统面临多重技术与合规挑战:海量影像数据的高效存储与分层管理、高并发下的实时调阅性能、DICOM标准的深度兼容、专业级图像处理与Web化可视化、与HIS/RIS/EMR系统的无缝集成、7×24小时高可用与数据安全,以及严格的医疗设备注册与网络安全认证。需融合存储架构、协议解析、临床流程与法规合规,构建稳定可靠的临床级系统,技术壁垒极高。
24 2
|
13天前
|
人工智能 运维 安全
|
10天前
|
存储 并行计算 调度
迈向可编程观测:在GPU Kernel中构建类eBPF风格的性能探针
本文旨在梳理作者学习路径,带领读者共同探索 GPU Kernel 性能分析从宏观到微观的技术演进。
130 14
迈向可编程观测:在GPU Kernel中构建类eBPF风格的性能探针
|
1天前
|
数据采集 机器学习/深度学习 搜索推荐
MIT新论文:数据即上限,扩散模型的关键能力来自图像统计规律,而非复杂架构
MIT与丰田研究院研究发现,扩散模型的“局部性”并非源于网络架构的精巧设计,而是自然图像统计规律的产物。通过线性模型仅学习像素相关性,即可复现U-Net般的局部敏感模式,揭示数据本身蕴含生成“魔法”。
19 3
MIT新论文:数据即上限,扩散模型的关键能力来自图像统计规律,而非复杂架构
|
1天前
|
存储 缓存 人工智能
《从木偶江湖到活色长安:NPC行为失控的架构级解决方案》
本文聚焦武侠开放世界游戏《江湖余烬》内测时,长安城高NPC密度、高交互场景下的NPC行为崩坏问题—25%的NPC出现动作重复、卡墙、剧情“失忆”等异常,仅在极限场景触发且常规修复无效。文章梳理了“主状态机+子行为树”的NPC技术架构,通过三层排查锁定核心矛盾:主线程卡顿致状态切换时序错乱,内存碎片引发数据串扰,事件总线拥堵形成恶性循环。经“状态协同重构+内存总线优化+监控容灾搭建”的三层解决方案,最终将NPC崩坏率降至0.3%,玩家投诉大幅下降,同步总结出开放世界NPC系统设计的五大核心教训,揭示架构协同稳定性对游戏沉浸感的关键意义。
|
1天前
|
机器学习/深度学习 数据采集 算法
【SCI二区IEEE复现】基于混合有限集模型预测控制(FCS-MPC)的模块化多电平换流器(MMC)整流电路仿真模型(Simulink仿真实现)
【SCI二区IEEE复现】基于混合有限集模型预测控制(FCS-MPC)的模块化多电平换流器(MMC)整流电路仿真模型(Simulink仿真实现)
|
1天前
|
负载均衡 算法 调度
基于遗传算法的新的异构分布式系统任务调度算法研究(Matlab代码实现)
基于遗传算法的新的异构分布式系统任务调度算法研究(Matlab代码实现)
42 10
|
1天前
|
算法 数据挖掘 区块链
基于遗传算法的多式联运车辆路径网络优优化研究(Matlab代码实现)
基于遗传算法的多式联运车辆路径网络优优化研究(Matlab代码实现)
|
1天前
|
Kubernetes 网络协议 调度
Kubernetes权威指南-深入理解Pod & Service
Pod是Kubernetes最小调度单元,将多个紧密协作的容器组合为一个逻辑主机,共享网络、存储与IP。通过YAML定义容器、卷、健康检查等配置,支持静态Pod、Init容器、ConfigMap等高级特性,并借助Service实现稳定的服务发现与负载均衡,Ingress则提供七层流量路由,构建高效、可靠的微服务架构。