news 2026/2/17 5:01:54

五大经典排序算法:插入、希尔、冒泡、选择、堆排序全攻略

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
五大经典排序算法:插入、希尔、冒泡、选择、堆排序全攻略

五大经典排序算法全攻略:插入、希尔、冒泡、选择、堆排序

这五个算法是学习排序算法时最常遇到的“入门+进阶”组合,它们在思想、复杂度、稳定性、适用场景上各有特点,非常适合对比学习。

下面按从简单到相对复杂的顺序详细讲解,并给出清晰对比表、核心思想、代码实现(Java)、关键性质和真实使用场景。

一、五大排序算法对比表(强烈建议背下来)

排序算法时间复杂度(最好/平均/最坏)空间复杂度稳定性原地排序思想关键词最佳适用场景
插入排序O(n) / O(n²) / O(n²)O(1)稳定像打扑克牌插牌小规模数据、近乎有序的数组
希尔排序O(n log n) ~ O(n¹·³) / O(n²)O(1)不稳定插入排序 + 分组缩小增量中等规模数据、部分有序
冒泡排序O(n) / O(n²) / O(n²)O(1)稳定相邻元素两两比较交换教学演示、极小规模数据
选择排序O(n²) / O(n²) / O(n²)O(1)不稳定每轮选最小/最大放前面交换次数要求极少的情况
堆排序O(n log n) / O(n log n) / O(n log n)O(1)不稳定构建大/小顶堆 + 堆顶交换需要稳定 O(n log n) 且空间紧张的场景

二、逐个详细讲解

1. 插入排序(Insertion Sort)

核心思想
把数组分为“已排序”和“未排序”两部分,每轮从未排序部分取一个元素,插入到已排序部分的正确位置(类似打扑克牌插牌)。

Java 实现(最清晰版本)

publicvoidinsertionSort(int[]arr){intn=arr.length;for(inti=1;i<n;i++){intkey=arr[i];// 当前要插入的数intj=i-1;// 将大于 key 的元素向后移动while(j>=0&&arr[j]>key){arr[j+1]=arr[j];j--;}arr[j+1]=key;// 插入到正确位置}}

稳定性稳定(相同元素相对顺序不变)

优化点:可以用二分查找优化查找插入位置(→ 折半插入排序)

2. 希尔排序(Shell Sort)

核心思想
插入排序的升级版,先进行大跨度分组插入排序,逐渐缩小分组间距(增量),最后变成增量为1的普通插入排序。

增量序列(常见几种):

  • 原始 Shell:n/2, n/4, …, 1
  • Hibbard:2^k - 1
  • Sedgewick:… 推荐使用较优序列

Java 实现(经典 /2 序列)

publicvoidshellSort(int[]arr){intn=arr.length;// 增量从大到小for(intgap=n/2;gap>0;gap/=2){// 对每个分组做插入排序for(inti=gap;i<n;i++){inttemp=arr[i];intj=i;while(j>=gap&&arr[j-gap]>temp){arr[j]=arr[j-gap];j-=gap;}arr[j]=temp;}}}

特点

  • 打破了 O(n²) 的魔咒(平均远好于 O(n²))
  • 不稳定(跨组交换导致)
3. 冒泡排序(Bubble Sort)

核心思想
相邻元素两两比较,如果顺序错误就交换,每轮把最大的元素“冒泡”到末尾。

Java 实现(带优化)

publicvoidbubbleSort(int[]arr){intn=arr.length;booleanswapped;for(inti=0;i<n-1;i++){swapped=false;// 每轮比较到未排序部分的末尾for(intj=0;j<n-1-i;j++){if(arr[j]>arr[j+1]){// 交换inttemp=arr[j];arr[j]=arr[j+1];arr[j+1]=temp;swapped=true;}}// 如果本轮没有交换,说明已经有序if(!swapped)break;}}

优化:加swapped标志位可提前结束

4. 选择排序(Selection Sort)

核心思想
每轮从未排序部分选出最小(或最大)的元素,放到已排序部分的末尾。

Java 实现

publicvoidselectionSort(int[]arr){intn=arr.length;for(inti=0;i<n-1;i++){intminIndex=i;// 在未排序部分找最小for(intj=i+1;j<n;j++){if(arr[j]<arr[minIndex]){minIndex=j;}}// 交换到正确位置if(minIndex!=i){inttemp=arr[i];arr[i]=arr[minIndex];arr[minIndex]=temp;}}}

特点:交换次数最少(最多 n-1 次)

5. 堆排序(Heap Sort)

核心思想
利用二叉堆(通常是大顶堆)特性:

  1. 先把数组建成大顶堆
  2. 每次把堆顶(最大元素)放到数组末尾
  3. 调整剩余堆,重复直到排序完成

Java 实现(大顶堆)

publicvoidheapSort(int[]arr){intn=arr.length;// 建堆(从第一个非叶子节点开始)for(inti=n/2-1;i>=0;i--){heapify(arr,n,i);}// 依次取出堆顶放到末尾for(inti=n-1;i>0;i--){// 交换堆顶和末尾swap(arr,0,i);// 调整剩余堆heapify(arr,i,0);}}// 堆调整(大顶堆)privatevoidheapify(int[]arr,intn,inti){intlargest=i;intleft=2*i+1;intright=2*i+2;if(left<n&&arr[left]>arr[largest]){largest=left;}if(right<n&&arr[right]>arr[largest]){largest=right;}if(largest!=i){swap(arr,i,largest);heapify(arr,n,largest);// 递归向下}}privatevoidswap(int[]arr,inti,intj){inttemp=arr[i];arr[i]=arr[j];arr[j]=temp;}

三、总结与选择建议

快速记忆口诀

  • 小数据 / 近乎有序 →插入排序
  • 中等数据 + 想简单优化 →希尔排序
  • 教学演示 / 理解交换 →冒泡
  • 交换次数最少 →选择排序
  • 稳定 O(n log n) + 空间 O(1) →堆排序

面试常问对比问题

  1. 哪些是稳定的?(插入、冒泡)
  2. 哪些一定是 O(n²)?(冒泡、插入、选择)
  3. 为什么堆排序不稳定?
  4. 希尔排序为什么比插入快很多?
  5. 实际项目中你会用哪种排序?为什么?

如果你想看这五种算法的动画演示对比稳定性动画不同数据规模下的性能实测,或者需要其他语言的实现(Python、C++、Go等),可以告诉我,我继续补充。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/15 20:34:30

2026年第一季度时序数据库3大迁移难点全解析——从“审慎评估”到“平稳过渡”的实施路径

金仓时序数据库替换实战&#xff1a;3大迁移难点全解析——从“审慎评估”到“平稳过渡”的实施路径 在智能电网实时负荷监测、医院重症监护设备毫秒级生命体征采集、工业物联网产线振动数据高频回传等关键业务场景中&#xff0c;时间维度的数据连续性与处理时效&#xff0c;直…

作者头像 李华
网站建设 2026/2/16 23:47:53

特征工程新纪元:2024核心方法、场景与工具全解析

特征工程新纪元&#xff1a;2024核心方法、场景与工具全解析 引言 “数据和特征决定了模型性能的上限&#xff0c;而模型和算法只是逼近这个上限。”——这句在机器学习领域广为流传的共识&#xff0c;至今仍是项目成功的金科玉律。 然而&#xff0c;时移世易。随着自动化工具…

作者头像 李华
网站建设 2026/2/15 2:05:36

Java static避坑:静态与非静态访问规则全解析

Java static 避坑&#xff1a;静态与非静态访问规则全解析 static 是 Java 中最容易踩坑的关键字之一&#xff0c;尤其是静态成员&#xff08;static 变量/方法&#xff09;与非静态成员&#xff08;实例变量/实例方法&#xff09;之间的访问规则。 很多人在写代码、面试、deb…

作者头像 李华
网站建设 2026/2/16 9:21:20

基于Java的高校智能排课系统-计算机毕设

【计算机毕业设计】基于Java的高校智能排课系统 完整设计与实现指南 恭喜你选择了一个经典且有深度的毕设题目&#xff01;高校智能排课系统&#xff08;University Timetabling System&#xff09;是教务管理中的核心痛点&#xff0c;涉及大量约束条件和优化问题&#xff0c;…

作者头像 李华
网站建设 2026/2/16 2:47:43

Java 集合框架进阶——List 实现类深度解析与实战优化

Java 集合框架进阶——List 实现类深度解析与实战优化&#xff08;2026最新版&#xff09; List 是 Java 集合框架中最常用、最重要的接口之一。它有序、可重复&#xff0c;支持按索引访问。日常开发中 80% 以上的集合场景都在用 List。 本篇聚焦进阶内容&#xff1a;不只是“…

作者头像 李华
网站建设 2026/2/16 10:32:33

《从 0 到 1:Nginx 入门、网络 I/O 模型与源码编译安装全指南》(1)

什么是Nginx&#xff1f; Nginx官网&#xff1a;http://nginx.org Nginx的功能 通过对nginx的功能进行介绍来介绍什么是nginx 1. Web 服务器&#xff08;静态资源服务&#xff09; Nginx 最基础、最常用的功能。 直接部署 HTML、CSS、JS、图片、视频等静态资源处理静态请求速度…

作者头像 李华