【排序算法】典型排序算法和python 实现

以下是排序算法的分类及经典Python实现,包含时间复杂度、空间复杂度与稳定性说明:


一、比较类排序(通过元素间比较决定顺序)

1. 交换排序
  1. 冒泡排序

    时间复杂度:O(n²)(最优O(n)已优化)

    空间复杂度:O(1)

    稳定性:稳定

    python 复制代码
    def bubble_sort(arr):
        n = len(arr)
        for i in range(n):
            swapped = False
            for j in range(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
  2. 快速排序

    时间复杂度:平均O(n log n),最差O(n²)

    空间复杂度:O(log n)(递归栈)

    稳定性:不稳定

    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)
2. 插入排序
  1. 直接插入排序
    时间复杂度:O(n²)(最优O(n))
    空间复杂度:O(1)
    稳定性:稳定

    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
3. 选择排序
  1. 简单选择排序
    时间复杂度:O(n²)
    空间复杂度:O(1)
    稳定性:不稳定

    python 复制代码
    def selection_sort(arr):
        for i in range(len(arr)):
            min_idx = i
            for j in range(i+1, len(arr)):
                if arr[j] < arr[min_idx]:
                    min_idx = j
            arr[i], arr[min_idx] = arr[min_idx], arr[i]
        return arr
4. 归并排序

时间复杂度:O(n log n)

空间复杂度:O(n)

稳定性:稳定

python 复制代码
def merge_sort(arr):
    if len(arr) <= 1:
        return arr
    mid = len(arr) // 2
    left = merge_sort(arr[:mid])
    right = merge_sort(arr[mid:])
    return merge(left, right)

def merge(left, right):
    res = []
    i = j = 0
    while i < len(left) and j < len(right):
        if left[i] <= right[j]:
            res.append(left[i])
            i += 1
        else:
            res.append(right[j])
            j += 1
    res.extend(left[i:] or right[j:])
    return res

二、非比较类排序(利用数值特征避免元素间比较)

1. 计数排序

时间复杂度:O(n + k)(k为数据范围)

空间复杂度:O(n + k)

稳定性:稳定(反向填充时)

适用场景:整数且范围较小

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

时间复杂度:O(nk)(k为最大位数)

空间复杂度:O(n + k)

稳定性:稳定

python 复制代码
def radix_sort(arr):
    max_val = max(arr)
    exp = 1
    while max_val // exp > 0:
        buckets = [[] for _ in range(10)]
        for num in arr:
            buckets[(num // exp) % 10].append(num)
        arr = [num for bucket in buckets for num in bucket]
        exp *= 10
    return arr
3. 桶排序

时间复杂度:平均O(n + k),最差O(n²)

空间复杂度:O(n + k)

适用场景:均匀分布的数据

python 复制代码
def bucket_sort(arr, bucket_size=5):
    min_val, max_val = min(arr), max(arr)
    bucket_count = (max_val - min_val) // bucket_size + 1
    buckets = [[] for _ in range(bucket_count)]
    for num in arr:
        idx = (num - min_val) // bucket_size
        buckets[idx].append(num)
    res = []
    for bucket in buckets:
        res.extend(sorted(bucket))
    return res

三、总结对比

算法 最优时间 平均时间 最差时间 空间 稳定 适用场景
冒泡排序 O(n) O(n²) O(n²) O(1) 教学示例
快速排序 O(n log n) O(n log n) O(n²) O(log n) 通用高效排序
归并排序 O(n log n) O(n log n) O(n log n) O(n) 外部排序、稳定需求
计数排序 O(n + k) O(n + k) O(n + k) O(n + k) 小范围整数
基数排序 O(nk) O(nk) O(nk) O(n + k) 多位数整数

根据数据规模与类型选择合适算法:小数据用简单排序(如插入),大数据优先选O(n log n)算法,特定场景使用非比较排序。

相关推荐
王老师青少年编程34 分钟前
csp信奥赛C++高频考点专项训练之贪心算法 --【哈夫曼贪心】:合并果子
c++·算法·贪心·csp·信奥赛·哈夫曼贪心·合并果子
叼烟扛炮1 小时前
C++第二讲:类和对象(上)
数据结构·c++·算法·类和对象·struct·实例化
天疆说1 小时前
【哈密顿力学】深入解读航天器交会最优控制中的Hamilton函数
人工智能·算法·机器学习
寒山李白2 小时前
解决 python-docx 生成的 Word 文档打开时弹出“无法读取内容“警告
python·word·wps·文档·docx·qoder
wuweijianlove2 小时前
关于算法设计中的代价函数优化与约束求解的技术7
算法
leoufung3 小时前
LeetCode 149: Max Points on a Line - 解题思路详解
算法·leetcode·职场和发展
样例过了就是过了3 小时前
LeetCode热题100 最长公共子序列
c++·算法·leetcode·动态规划
2401_832365523 小时前
JavaScript中rest参数(...args)取代arguments的优势
jvm·数据库·python
Sirius.z3 小时前
第J3周:DenseNet121算法详解
python
HXDGCL3 小时前
矩形环形导轨:自动化循环线的核心运动单元解析
运维·算法·自动化