【排序】快速排序、归并排序

以下是快速排序与归并排序详解,结合通俗例子和核心考点,助你高效掌握关键概念。


一、快速排序(Quick Sort)

1. 核心思想
  • 分治策略:选一个基准值(pivot),将数组分为两部分——左侧全≤基准值,右侧全>基准值,递归处理子数组。
  • 通俗例子

    假设超市结账排队,选一人身高1.7m为基准,比他矮的站左边,高的站右边。接着左右两队各自重复此操作,直到全员有序。

2. 代码实现(Python)
import random
def quick_sort(arr, l, r):
    if l >= r: return
    # 优化:随机选基准避免最坏情况
    pivot_idx = random.randint(l, r)
    arr[l], arr[pivot_idx] = arr[pivot_idx], arr[l]
    pivot = arr[l]
    i, j = l, r
    while i < j:
        while i < j and arr[j] >= pivot: j -= 1  # 右找小值
        while i < j and arr[i] <= pivot: i += 1  # 左找大值
        if i < j: arr[i], arr[j] = arr[j], arr[i]
    arr[l], arr[i] = arr[i], arr[l]  # 基准归位
    quick_sort(arr, l, i-1)
    quick_sort(arr, i+1, r)
3. 性能分析
指标详情
时间复杂度平均:O(n log n);最坏(有序数组):O(n²)
空间复杂度递归栈深度,平均O(log n)
稳定性❌ 不稳定(交换可能破坏相等元素顺序)
4. 面试优化点
  • 随机基准:避免有序数组导致分区失衡。
  • 三数取中:选左、中、右的中位数作基准,进一步优化分区。
  • 小规模转插入排序:当子数组<10时,插入排序更高效(因常数因子小)。

🔄 二、归并排序(Merge Sort)

1. 核心思想
  • 分治+合并:数组二分至单元素(天然有序),再两两合并成有序大数组。
  • 通俗例子

    整理扑克牌:先分成两堆分别排序,再将两堆牌按大小合并。合并时比较两堆顶部的牌,取小者放入新堆。

2. 代码实现(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
3. 性能分析
指标详情
时间复杂度稳定O(n log n)(任何情况)
空间复杂度O(n)(需额外数组存储合并结果)
稳定性✅ 稳定(合并时优先取左组元素)
4. 面试考点
  • 稳定性应用:多字段排序(如先按价格排序,再按销量排序,价格相同的保持原顺序)。
  • 迭代写法:避免递归栈溢出(用循环模拟分组合并)。
  • 链表排序优势:无需随机访问,适合链表数据结构(如Java的Collections.sort())。

⚖️ 三、快速排序 vs 归并排序:面试对比表

维度快速排序归并排序
时间复杂度平均O(n log n),最坏O(n²)稳定O(n log n)
空间复杂度平均O(log n)(递归栈)O(n)(额外数组)
稳定性❌ 不稳定✅ 稳定
适用场景大规模随机数据,内存敏感需稳定性、链表排序、外部排序
优化方向随机基准、小规模转插入排序迭代写法、空间复用(难)

💡 四、面试高频问题与回答思路

  1. 快排最坏情况如何优化?
    :最坏发生在数组有序时。优化:随机选基准 + 小规模转插入排序。

  2. 归并排序为何稳定?快排为何不稳定?
    :归并合并时优先取左组元素;快排的分区交换可能导致相等元素移位(例:[3A, 3B] → [3B, 3A])。

  3. 时间空间复杂度如何推导?

    • 快排:理想递归树高log n,每层分区O(n) → O(n log n);最坏树高n → O(n²)。
    • 归并:递归树高log n,每层合并O(n) → O(n log n);合并需临时数组 → O(n)。

重点记忆时间复杂度对比稳定性差异优化策略,辅以生活化类比加深印象。加油! 🚀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一蓑烟雨AC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值