news 2026/4/18 9:10: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/4/18 8:06:40

Win系通用懒人助手,附使用指引

工具介绍&#xff1a;Win系统通用懒人助手&#xff0c;兼容本站发布的大部分Win端&#xff08;需要修改数据库&#xff0c;修改的文件有加密要对位的&#xff0c;下载对应专用懒人工具&#xff09;包含了服务端&#xff0c;批量替换&#xff0c;客户端批量修改包名&#xff0c;…

作者头像 李华
网站建设 2026/3/7 4:50:35

AI数学基础补漏:线性代数核心概念(矩阵)运算与应用

AI 数学基础补漏&#xff1a;线性代数核心概念&#xff08;矩阵&#xff09;运算与应用 昨天咱们聊了“向量”&#xff0c;那是 AI 世界里的点和线。今天第 19 天&#xff0c;咱们要聊聊那个真正让数据“动”起来的大家伙——矩阵&#xff08;Matrix&#xff09;。 在架构师眼…

作者头像 李华
网站建设 2026/4/18 8:46:13

华为eNSP综合实验之- 掩码反掩码和通配符适用场景

掩码、反掩码和通配符虽然形式上都是32位二进制数&#xff0c;但它们的逻辑、用途和适用场景完全不同1. 子网掩码这是三者中最基础、最常见的一个。核心逻辑&#xff1a;连续的1后面跟着连续的0。1的部分表示网络位&#xff0c;0的部分表示主机位。它用于定义一个IP地址中哪部分…

作者头像 李华
网站建设 2026/4/18 1:57:27

说话就能让AI写出顶级代码?Vercel官方经验包来了

先说前提&#xff1a;这个干嘛的 用大白话说&#xff1a;Vercel是全球最大的网页托管平台。 你知道GitHub吗&#xff1f;全球最大的代码托管平台。 Vercel就是网页版的GitHub&#xff0c;全世界数百万网站都用它托管。 服务过哪些大牌&#xff1f; 有字节跳动、Adobe、IBM这些…

作者头像 李华
网站建设 2026/4/18 3:36:13

2026年阿里云极速简易部署OpenClaw教程

OpenClaw是什么&#xff1f;2026年2月OpenClaw&#xff08;Clawdbot&#xff09;一键部署入门。OpenClaw&#xff08;Clawdbot&#xff09;能做什么&#xff1f;OpenClaw怎么样&#xff1f;OpenClaw&#xff08;Clawdbot&#xff09;是什么&#xff1f;OpenClaw&#xff08;原C…

作者头像 李华