常用排序算法


1. 基础排序算法

1.1 冒泡排序(Bubble Sort)

原理

依次比较相邻元素,将较大的元素逐步"冒泡"到右侧。

python 复制代码
def bubble_sort(arr):
    n = len(arr)
    for i in range(n):
        swapped = False
        for j in range(0, n-i-1):
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]
                swapped = True
        if not swapped:
            break
    return arr

时间复杂度

  • 最佳:O(n)(已有序时)
  • 平均/最差:O(n²)
    适用场景:教学用途或小型数据集

1.2 选择排序(Selection Sort)

原理

每次遍历选择未排序部分的最小值,放到已排序序列末尾。

python 复制代码
def selection_sort(arr):
    n = len(arr)
    for i in range(n):
        min_idx = i
        for j in range(i+1, n):
            if arr[j] < arr[min_idx]:
                min_idx = j
        arr[i], arr[min_idx] = arr[min_idx], arr[i]
    return arr

时间复杂度

  • 所有情况:O(n²)
    适用场景:内存敏感的小型数据集

1.3 插入排序(Insertion Sort)

原理

将每个元素插入到已排序序列的合适位置。

python 复制代码
def insertion_sort(arr):
    for i in range(1, len(arr)):
        key = arr[i]
        j = i-1
        while j >=0 and key < arr[j]:
            arr[j+1] = arr[j]
            j -= 1
        arr[j+1] = key 
    return arr

时间复杂度

  • 最佳:O(n)(已有序时)
  • 平均/最差:O(n²)
    适用场景:小规模数据或基本有序的数据

2. 高效排序算法

2.1 快速排序(Quick Sort)

原理

分治策略,选取基准值将数组分为两部分递归排序。

python 复制代码
def quick_sort(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[len(arr)//2]
    left = [x for x in arr if x < pivot]
    middle = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]
    return quick_sort(left) + middle + quick_sort(right)

时间复杂度

  • 平均:O(n log n)
  • 最差:O(n²)(当已有序且选第一个元素为基准时)
    优化 :三数取中法选择基准
    适用场景:通用排序,尤其适合大规模随机数据

2.2 归并排序(Merge Sort)

原理

分治法将数组拆分为最小单元后合并排序。

python 复制代码
def merge_sort(arr):
    if len(arr) > 1:
        mid = len(arr)//2
        L = arr[:mid]
        R = arr[mid:]
        merge_sort(L)
        merge_sort(R)
        
        i = j = k = 0
        while i < len(L) and j < len(R):
            if L[i] < R[j]:
                arr[k] = L[i]
                i += 1
            else:
                arr[k] = R[j]
                j += 1
            k += 1
        
        while i < len(L):
            arr[k] = L[i]
            i += 1
            k += 1
        
        while j < len(R):
            arr[k] = R[j]
            j += 1
            k += 1
    return arr

时间复杂度

  • 所有情况:O(n log n)
    适用场景:需要稳定排序且内存充足时

2.3 堆排序(Heap Sort)

原理

利用堆数据结构实现选择排序。

python 复制代码
def heapify(arr, n, i):
    largest = i
    l = 2 * i + 1
    r = 2 * i + 2
    if l < n and arr[i] < arr[l]:
        largest = l
    if r < n and arr[largest] < arr[r]:
        largest = r
    if largest != i:
        arr[i], arr[largest] = arr[largest], arr[i]
        heapify(arr, n, largest)

def heap_sort(arr):
    n = len(arr)
    for i in range(n//2-1, -1, -1):
        heapify(arr, n, i)
    for i in range(n-1, 0, -1):
        arr[i], arr[0] = arr[0], arr[i]
        heapify(arr, i, 0)
    return arr

时间复杂度

  • 所有情况:O(n log n)
    适用场景:需要O(1)空间复杂度的高效排序

3. 特殊场景算法

3.1 计数排序(Counting Sort)

原理

统计元素出现次数,适用于整数范围较小的情况。

python 复制代码
def counting_sort(arr):
    max_val = max(arr)
    count = [0] * (max_val+1)
    for num in arr:
        count[num] += 1
    sorted_arr = []
    for i in range(len(count)):
        sorted_arr.extend([i]*count[i])
    return sorted_arr

时间复杂度

  • O(n + k)(k为数据范围)
    适用场景:整数排序且值域较小

3.2 基数排序(Radix Sort)

原理

按位排序,从低位到高位依次排序。

python 复制代码
def counting_sort_for_radix(arr, exp):
    n = len(arr)
    output = [0] * n
    count = [0] * 10
    
    for i in range(n):
        index = (arr[i] // exp) % 10
        count[index] += 1
    
    for i in range(1,10):
        count[i] += count[i-1]
    
    i = n-1
    while i >= 0:
        index = (arr[i] // exp) % 10
        output[count[index]-1] = arr[i]
        count[index] -= 1
        i -= 1
    
    for i in range(n):
        arr[i] = output[i]

def radix_sort(arr):
    max_val = max(arr)
    exp = 1
    while max_val // exp > 0:
        counting_sort_for_radix(arr, exp)
        exp *= 10
    return arr

时间复杂度

  • O(nk)(k为最大位数)
    适用场景:整数或字符串排序

4. Python内置排序

Python的sorted()list.sort()使用Timsort算法(归并排序+插入排序的混合算法):

python 复制代码
# 基本排序
sorted_list = sorted([3,1,4,2])
lst = [3,1,4,2]
lst.sort()

# 自定义排序
sorted(students, key=lambda x: x.age)  # 按对象属性排序
sorted(words, key=len)                 # 按字符串长度排序

算法对比表

算法 时间复杂度(平均) 是否稳定 是否原地 适用场景
冒泡排序 O(n²) 教学/小数据
快速排序 O(n log n) 通用大规模数据
归并排序 O(n log n) 需要稳定排序
堆排序 O(n log n) 内存敏感的大数据
Timsort O(n log n) Python内置通用排序

选择建议

  1. 小数据量(n < 1000):插入排序或选择排序
  2. 通用场景 :优先使用内置的sorted()list.sort()
  3. 内存敏感:堆排序
  4. 稳定排序需求:归并排序或Timsort
  5. 整数范围小:计数排序/基数排序
相关推荐
L、2184 分钟前
CANN算子开发调试实战:从“Segmentation Fault“到定位根因的完整流程
java·开发语言
运筹vivo@42 分钟前
2657. 找到两个数组的前缀公共数组 | 难度:中等
算法·leetcode·职场和发展·哈希表
索木木1 小时前
NCCL SHARP 和 TREE算法
java·服务器·算法
NiceCloud喜云1 小时前
Claude Files API 深入:从上传、复用到配额管理的工程化指南
android·java·数据库·人工智能·python·json·飞书
超梦dasgg2 小时前
Java 生产环境 MQ 技术选型全解析
java·开发语言·java-rocketmq·java-rabbitmq
霸道流氓气质2 小时前
Spring AI 多工具链式调用(Tool Chain)极简实战
java·人工智能·spring
心中有国也有家2 小时前
hccl 架构拆解:昇腾集合通信库到底在做什么?
人工智能·经验分享·笔记·分布式·算法·架构
罗超驿2 小时前
22.深入剖析JDBC架构:从原生API到企业级数据交互核心
java·数据库·mysql·面试
一直有一个ac的梦想3 小时前
cmu15445 2025fall lec 18 transactions with two-phase lock
java·开发语言·数据库
九皇叔叔3 小时前
Spring-Ai-Alibaba [04] 04-llm-platform-custom-demo
java·人工智能·spring