📚 排序算法知识点大全(超详细版)
一、排序算法分类概览
类型 |
算法 |
交换类 |
冒泡排序、快速排序 |
插入类 |
直接插入排序、希尔排序 |
选择类 |
选择排序、堆排序 |
归并类 |
归并排序 |
分布类 |
计数排序、桶排序、基数排序 |
二、基础排序算法详解
1. 冒泡排序(Bubble Sort)
- 原理:相邻两两比较,大的往后冒。
- 时间复杂度:
- 空间复杂度:O(1)
- 稳定性:✅ 稳定
- 适用场景:数据量小,几乎排好序的数组
for i in range(n):
for j in range(n - i - 1):
if arr[j] > arr[j + 1]:
arr[j], arr[j + 1] = arr[j + 1], arr[j]
2. 选择排序(Selection Sort)
- 原理:每轮从未排序序列中选出最小元素放在前面。
- 时间复杂度:O(n²)
- 空间复杂度:O(1)
- 稳定性:❌ 不稳定
- 适用场景:内存开销敏感但效率要求不高场景
3. 插入排序(Insertion Sort)
- 原理:将数据插入到已排好序序列中。
- 时间复杂度:
- 空间复杂度:O(1)
- 稳定性:✅ 稳定
- 适用场景:部分有序、数据量小
4. 希尔排序(Shell Sort)
- 原理:对插入排序的优化,分组进行插入排序,逐渐缩小间距。
- 时间复杂度:O(n¹.³ ~ n²)(依赖增量序列)
- 空间复杂度:O(1)
- 稳定性:❌ 不稳定
- 适用场景:中等规模数组排序
三、高级排序算法详解
5. 快速排序(Quick Sort)
- 原理:选基准元素,将小的放左边,大的放右边,递归处理。
- 时间复杂度:
- 平均:O(n log n)
- 最坏:O(n²)(已排序数据)
- 空间复杂度:O(log n)
- 稳定性:❌ 不稳定
- 适用场景:大数据量,高效率需求
def quicksort(arr):
if len(arr) <= 1:
return arr
pivot = arr[0]
left = [x for x in arr[1:] if x <= pivot]
right = [x for x in arr[1:] if x > pivot]
return quicksort(left) + [pivot] + quicksort(right)
6. 归并排序(Merge Sort)
- 原理:分而治之,将数组不断二分后合并排序。
- 时间复杂度:O(n log n)
- 空间复杂度:O(n)
- 稳定性:✅ 稳定
- 适用场景:链表、大数据排序(可用于外部排序)
7. 堆排序(Heap Sort)
- 原理:构建大顶堆/小顶堆,每次取出堆顶元素,重建堆。
- 时间复杂度:O(n log n)
- 空间复杂度:O(1)
- 稳定性:❌ 不稳定
- 适用场景:对空间敏感、实时排序系统
四、非比较类排序(线性排序)
8. 计数排序(Counting Sort)
- 原理:统计数组中每个值出现的次数,适用于整数。
- 时间复杂度:O(n + k),k为数据范围
- 空间复杂度:O(k)
- 稳定性:✅ 稳定
- 适用场景:整数、数据范围小(如年龄分布)
9. 桶排序(Bucket Sort)
- 原理:划分桶,每个桶内排序后再合并
- 时间复杂度:平均 O(n),最坏 O(n²)
- 空间复杂度:O(n + k)
- 稳定性:✅ 稳定
- 适用场景:数据均匀分布、浮点数排序
10. 基数排序(Radix Sort)
- 原理:按位(从低到高)进行多轮稳定排序(如个位→十位)
- 时间复杂度:O(d × (n + k))
- 空间复杂度:O(n + k)
- 稳定性:✅ 稳定
- 适用场景:数字、字符串排序(身份证号、手机号)
五、排序算法对比总表
算法 |
时间复杂度(最坏) |
空间复杂度 |
稳定性 |
特点简述 |
冒泡排序 |
O(n²) |
O(1) |
✅ |
简单但效率低 |
选择排序 |
O(n²) |
O(1) |
❌ |
无需额外空间 |
插入排序 |
O(n²) |
O(1) |
✅ |
小数据、部分有序表现好 |
希尔排序 |
O(n²) |
O(1) |
❌ |
插入优化版,不稳定 |
快速排序 |
O(n²) |
O(log n) |
❌ |
平均最快,空间占用小 |
归并排序 |
O(n log n) |
O(n) |
✅ |
稳定、适合大数据或链表 |
堆排序 |
O(n log n) |
O(1) |
❌ |
优先队列应用,效率好 |
计数排序 |
O(n + k) |
O(k) |
✅ |
非比较型,适合整数且范围小 |
桶排序 |
O(n)~O(n²) |
O(n+k) |
✅ |
数据分布均匀效果佳 |
基数排序 |
O(d × (n + k)) |
O(n + k) |
✅ |
适合长数字串或定长ID排序 |
六、实际应用推荐
场景 |
推荐算法 |
原因 |
数据量小,已近乎有序 |
插入排序 |
快速简单 |
需稳定排序,数据大 |
归并排序 |
稳定、效率高 |
内存敏感 |
堆排序 |
O(1)空间复杂度 |
数字范围固定 |
计数/桶/基数排序 |
非比较排序更高效 |
实时高性能需求 |
快速排序 |
平均效率最优 |