十大经典排序算法大梳理
时间、空间复杂度比较
排序算法 | 平均时间复杂度 | 最差时间复杂度 | 空间复杂度 | 数据对象稳定性 |
---|---|---|---|---|
冒泡排序 | O(n2) | O(n2) | O(1) | 稳定 |
选择排序 | O(n2) | O(n2) | O(1) | 数组不稳定、链表稳定 |
插入排序 | O(n2) | O(n2) | O(1) | 稳定 |
快速排序 | O(n*log2n) | O(n2) | O(log2n) | 不稳定 |
堆排序 | O(n*log2n) | O(n*log2n) | O(1) | 不稳定 |
归并排序 | O(n*log2n) | O(n*log2n) | O(n) | 稳定 |
希尔排序 | O(n*log2n) | O(n2) | O(1) | 不稳定 |
计数排序 | O(n+m) | O(n+m) | O(n+m) | 稳定 |
桶排序 | O(n) | O(n) | O(m) | 稳定 |
基数排序 | O(k*n) | O(n2) | 稳定 |
1 冒泡排序
算法思想:
-
比较相邻的元素。如果第一个比第二个大,就交换他们两个。 -
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。 -
针对所有的元素重复以上的步骤,除了最后一个。 -
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
代码:
2 选择排序
算法思想:
-
在未排序序列中找到最小(大)元素,存放到排序序列的起始位置 -
从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾 -
以此类推,直到所有元素均排序完毕
代码:
3 插入排序
算法思想:
-
从第一个元素开始,该元素可以认为已经被排序 -
取出下一个元素,在已经排序的元素序列中从后向前扫描 -
如果该元素(已排序)大于新元素,将该元素移到下一位置 -
重复步骤3,直到找到已排序的元素小于或者等于新元素的位置 -
将新元素插入到该位置后 -
重复步骤2~5
代码:
4 快速排序
算法思想:
-
选取第一个数为基准 -
将比基准小的数交换到前面,比基准大的数交换到后面 -
对左右区间重复第二步,直到各区间只有一个数
代码:
5 堆排序
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
算法思想:
-
将初始待排序关键字序列(R1,R2….Rn)构建成大顶堆,此堆为初始的无序区; -
将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,……Rn-1)和新的有序区(Rn),且满足R[1,2…n-1]<=R[n]; -
由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前无序区(R1,R2,……Rn-1)调整为新堆,然后再次将R[1]与无序区最后一个元素交换,得到新的无序区(R1,R2….Rn-2)和新的有序区(Rn-1,Rn)。不断重复此过程直到有序区的元素个数为n-1,则整个排序过程完成。
代码:
6 归并排序
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。
算法思想:1.把长度为n的输入序列分成两个长度为n/2的子序列;2. 对这两个子序列分别采用归并排序;3. 将两个排序好的子序列合并成一个最终的排序序列。
代码:
7 希尔排序
希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序.
算法思想:
-
选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1; -
按增量序列个数k,对序列进行k 趟排序; -
每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。
代码:
8 计数排序
计数排序统计小于等于该元素值的元素的个数i,于是该元素就放在目标数组的索引i位(i≥0)。
-
计数排序基于一个假设,待排序数列的所有数均为整数,且出现在(0,k)的区间之内。 -
如果 k(待排数组的最大值) 过大则会引起较大的空间复杂度,一般是用来排序 0 到 100 之间的数字的最好的算法,但是它不适合按字母顺序排序人名。 -
计数排序不是比较排序,排序的速度快于任何比较排序算法。
算法思想:
-
找出待排序的数组中最大和最小的元素; -
统计数组中每个值为 i 的元素出现的次数,存入数组 C 的第 i 项; -
对所有的计数累加(从 C 中的第一个元素开始,每一项和前一项相加); -
向填充目标数组:将每个元素 i 放在新数组的第 C[i] 项,每放一个元素就将 C[i] 减去 1;
代码:
9 桶排序
将值为i的元素放入i号桶,最后依次把桶里的元素倒出来。
算法思想:
-
设置一个定量的数组当作空桶子。 -
寻访序列,并且把项目一个一个放到对应的桶子去。 -
对每个不是空的桶子进行排序。 -
从不是空的桶子里把项目再放回原来的序列中。
代码:
10 基数排序
一种多关键字的排序算法,可用桶排序实现。
算法思想:
-
取得数组中的最大数,并取得位数; -
arr为原始数组,从最低位开始取每个位组成radix数组; -
对radix进行计数排序(利用计数排序适用于小范围数的特点)
代码:
参考资料
-
https://www.cnblogs.com/onepixel/p/7674659.html(部分动图来源) -
电子工程专辑
__EOF__

本文作者:夜雨闻铃
本文链接:https://www.cnblogs.com/sugeek/articles/16608606.html
关于博主:编程菜鸟一只,希望每个今天胜过昨天,一步步走向技术的高峰!
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/sugeek/articles/16608606.html
关于博主:编程菜鸟一只,希望每个今天胜过昨天,一步步走向技术的高峰!
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具