数据结构 - 排序

📚 排序算法知识点大全(超详细版)


一、排序算法分类概览

类型 算法
交换类 冒泡排序、快速排序
插入类 直接插入排序、希尔排序
选择类 选择排序、堆排序
归并类 归并排序
分布类 计数排序、桶排序、基数排序

二、基础排序算法详解

1. 冒泡排序(Bubble Sort)

  • 原理:相邻两两比较,大的往后冒。
  • 时间复杂度
    • 最好:O(n)
    • 最坏:O(n²)
  • 空间复杂度: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(n)
    • 最坏:O(n²)
  • 空间复杂度: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)空间复杂度
数字范围固定 计数/桶/基数排序 非比较排序更高效
实时高性能需求 快速排序 平均效率最优

posted @ 2025-05-18 20:07  vv大人  阅读(43)  评论(0)    收藏  举报