快速排序

Admin
发布于 2026-05-21 / 1 阅读
0
0
"""
快速排序
"""

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)

arr = [64, 34, 25, 12, 22, 11, 90]
print(quick_sort(arr))

这段代码实现的是非常经典的排序算法——**快速排序**。下面我将为你详细解释这段代码的实现原理、用途以及注意事项。

### 一、 代码含义与实现原理

快速排序的核心思想是**“分而治之”**。这段代码通过递归的方式,将一个大问题拆解为小问题来解决。具体步骤如下:

1. 递归终止条件

```python

if len(arr) <= 1:

return arr

```

如果数组的长度小于等于1,说明数组已经不需要排序了,直接返回即可。这是递归出口,防止无限循环。

2. 选择基准

```python

pivot = arr[len(arr) // 2]

```

从数组中选择一个元素作为“基准”。这段代码选择了数组的**中间元素**作为基准值。

3. 分区

```python

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]

```

遍历原数组,将所有元素分为三部分:

- left:严格小于基准的元素集合。

- middle:等于基准的元素集合(处理数组中存在重复元素的情况)。

- right:严格大于基准的元素集合。

4. 递归排序与合并

```python

return quick_sort(left) + middle + quick_sort(right)

```

leftright 分别递归调用快速排序,最后将排序好的左半部分、等于基准的部分、以及排序好的右半部分拼接起来,形成最终排好序的数组。

---

### 二、 用途

快速排序是实际开发中最常用的排序算法之一,其用途广泛:

1. 通用数据排序:适用于大多数需要排序的场景,如数字、字符串等可比较对象的排序。

2. 大规模数据处理:在平均情况下,快速排序的时间复杂度为 $O(n \log n)$,处理大规模数据时效率极高。

3. 语言内置排序的底层实现:许多编程语言(如Pythonsorted()list.sort(),以及C++std::sort)的底层排序算法都融合了快速排序的思想(通常结合了插入排序和堆排序,即内省排序 Introsort)。

---

### 三、 注意事项

虽然这段代码非常优雅且易于理解,但在实际工程应用中,有以下几个关键点需要注意:

1. 空间复杂度较高(非原地排序)

- 传统的快速排序是**原地排序**,通过在原数组上交换元素来实现,空间复杂度为 $O(\log n)$(递归栈空间)。

- 而这段代码使用了列表推导式生成了 leftmiddleright 三个新列表,每次递归都会创建新数组,导致空间复杂度上升至 $O(n \log n)$,在处理大数据量时极其消耗内存。

2. 稳定性

- 这段代码实现的是**稳定排序**,因为相等的元素被放在 middle 列表中,相对顺序得到了保持。

- 但传统的通过左右指针交换实现的快速排序是**不稳定排序**,因为元素的跨区间交换可能会改变相等元素的相对顺序。

3. 最坏时间复杂度(性能退化)

- 快速排序的最坏时间复杂度是 $O(n^2)$。当数组已经是有序或逆序时,如果每次都选择第一个或最后一个元素作为基准,会导致分区极度不平衡(一边为空,另一边是所有剩余元素)。

- 本代码的优势:这段代码选择中间元素作为基准,巧妙地避开了“严格递增/递减数组”导致的 $O(n^2)$ 退化问题。

- 潜在风险:如果遇到精心构造的恶意数据(使得中间元素总是当前子数组的最小或最大值),依然会退化。工程上通常采用**“三数取中法”**或**“随机选择基准法”**来降低这种风险。

4. Pythonic 但效率非最优

- 这种写法非常符合Python的审美,简洁易读,但列表推导式加上列表拼接+)操作带来了大量的内存分配和数据拷贝。在Python中,如果追求极致性能,建议直接使用内置的 list.sort()sorted(),它们由C语言实现,底层优化极高。

### 总结

这段代码是快速排序的一种**教学级/易读级实现**,非常适合用来理解“分治法”和快速排序的核心逻辑。但在生产环境中处理大规模数据时,建议使用原地交换的快排实现或直接调用语言内置的排序方法。


评论