观察分治策略与基准元素的分区过程
快速排序(Quick Sort)是一种高效的分治排序算法。它选择一个"基准"元素,将数组分成两部分:比基准小的元素放在左边,比基准大的元素放在右边。然后递归地对左右两部分继续排序。因其出色的平均性能,快速排序是实际应用中最常用的排序算法之一。
| 情况 | 时间复杂度 | 说明 |
|---|---|---|
| 最好情况 | O(n log n) | 每次分区都能平均分割数组 |
| 平均情况 | O(n log n) | 随机输入的期望性能 |
| 最坏情况 | O(n²) | 每次选到最大或最小元素作为基准 |
| 空间复杂度 | O(log n) | 递归调用栈的深度 |
快速排序是不稳定排序,但可以通过三路划分等变体来优化。
def partition(arr, low, high): """分区函数:选择最后一个元素作为基准""" pivot = arr[high] i = low - 1 for j in range(low, high): if arr[j] <= pivot: i += 1 arr[i], arr[j] = arr[j], arr[i] arr[i + 1], arr[high] = arr[high], arr[i + 1] return i + 1 def quick_sort(arr, low, high): """快速排序算法""" if low < high: # 获取分区点 pi = partition(arr, low, high) # 递归排序左右两部分 quick_sort(arr, low, pi - 1) quick_sort(arr, pi + 1, high) # 使用示例 arr = [10, 7, 8, 9, 1, 5] quick_sort(arr, 0, len(arr) - 1) print(arr) # 输出: [1, 5, 7, 8, 9, 10]
public class QuickSort { /** * 分区函数 */ private static int partition(int[] arr, int low, int high) { int pivot = arr[high]; int i = low - 1; for (int j = low; j < high; j++) { if (arr[j] <= pivot) { i++; // 交换 int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } // 将基准放到正确位置 int temp = arr[i + 1]; arr[i + 1] = arr[high]; arr[high] = temp; return i + 1; } /** * 快速排序算法 */ public static void quickSort(int[] arr, int low, int high) { if (low < high) { int pi = partition(arr, low, high); quickSort(arr, low, pi - 1); quickSort(arr, pi + 1, high); } } public static void main(String[] args) { int[] arr = {10, 7, 8, 9, 1, 5}; quickSort(arr, 0, arr.length - 1); System.out.println(Arrays.toString(arr)); // 输出: [1, 5, 7, 8, 9, 10] } }