知用网
第二套高阶模板 · 更大气的阅读体验

递归排序算法例子:快速理解常见的递归排序实现

发布时间:2025-12-11 14:24:24 阅读:295 次

递归排序算法的基本思路

在处理大量数据时,排序是程序中最常见的操作之一。递归排序算法利用“分而治之”的思想,把一个大问题拆成多个小问题来解决。比如你有一堆杂乱无章的发票要按日期排好,与其从头到尾一个个比,不如先把它们分成几小叠,每叠排好后再合并,效率高得多。

快速排序:最典型的递归排序例子

快速排序是使用递归最广泛的排序算法之一。它的核心是选一个基准值(pivot),把数组中小于它的放左边,大于的放右边,然后对左右两部分分别递归执行相同操作。

def quicksort(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 quicksort(left) + middle + quicksort(right)

# 使用示例
nums = [3, 6, 8, 10, 1, 2, 1]
sorted_nums = quicksort(nums)
print(sorted_nums)  # 输出: [1, 1, 2, 3, 6, 8, 10]

这段代码简洁明了,每次递归处理更小的子数组,直到数组长度为0或1时停止。就像整理书架时,先挑出中间厚度的书,再分别整理偏薄和偏厚的部分。

归并排序:稳定可靠的递归方案

归并排序也是递归的经典应用。它不管当前数据分布如何,始终坚持把数组从中间切开,递归排好两半后,再把两个有序部分合并成一个整体。

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):
    result = []
    i = j = 0
    while i < len(left) and j < len(right):
        if left[i] <= right[j]:
            result.append(left[i])
            i += 1
        else:
            result.append(right[j])
            j += 1
    result.extend(left[i:])
    result.extend(right[j:])
    return result

# 使用示例
data = [5, 2, 9, 1, 7, 6]
sorted_data = merge_sort(data)
print(sorted_data)  # 输出: [1, 2, 5, 6, 7, 9]

归并排序适合对稳定性要求高的场景,比如你导出的订单记录,时间相同的条目顺序不能乱。它的运行时间稳定,不会因为原始数据顺序差而变慢。

递归调用的边界条件别忘了

写递归排序时最容易犯的错就是忘记终止条件。像上面两个例子中,都明确写了数组长度小于等于1时直接返回。没有这个“刹车”,函数会无限调用下去,最终导致栈溢出——就像不停对着镜子照镜子,画面一直重复进不去尽头。

实际开发中,面对上万条数据时,递归深度可能受限。有些语言或环境会对递归层数设限,这时可以考虑改用迭代方式,或者增加尾递归优化(如果语言支持)。