快速排序(Quick Sort)
快速排序是应用最广泛的排序算法之一,采用**分治法(Divide and Conquer)**策略:每次选择一个“基准元素”将数组划分为左右两部分,然后递归排序左右两侧子数组。
由于其平均时间复杂度为 O(n log n)、原地排序、常数因子小,在大多数实际应用中性能优于归并排序与堆排序。
📌 算法原理解释
快速排序的核心流程如下:
- 选定一个基准(pivot),通常是当前子数组的第一个、最后一个或中间值;
- 将数组划分为两部分:小于等于基准值的放左边,大于的放右边;
- 对左右两部分分别递归执行快速排序;
- 最终组合结果。
例如数组 [6, 3, 8, 5, 2],以 6 为基准:
- 小于6的:[3, 5, 2]
- 大于6的:[8]
- 合并为
[2, 3, 5, 6, 8]
💻 多语言代码实现
// JavaScript 快速排序
function quickSort(arr) {
if (arr.length <= 1) return arr;
const pivot = arr[0];
const left = arr.slice(1).filter(x => x <= pivot);
const right = arr.slice(1).filter(x => x > pivot);
return [...quickSort(left), pivot, ...quickSort(right)];
}
`
# Python 快速排序
def quick_sort(arr):
if len(arr) <= 1:
return arr
pivot = arr[0]
left = [x for x in arr[1:] if x <= pivot]
right = [x for x in arr[1:] if x > pivot]
return quick_sort(left) + [pivot] + quick_sort(right)
// C++ 快速排序(原地)
#include <vector>
using namespace std;
void quickSort(vector<int>& arr, int left, int right) {
if (left >= right) return;
int pivot = arr[left], i = left, j = right;
while (i < j) {
while (i < j && arr[j] >= pivot) j--;
arr[i] = arr[j];
while (i < j && arr[i] <= pivot) i++;
arr[j] = arr[i];
}
arr[i] = pivot;
quickSort(arr, left, i - 1);
quickSort(arr, i + 1, right);
}
// Java 快速排序
public class QuickSort {
public static void quickSort(int[] arr, int left, int right) {
if (left >= right) return;
int pivot = arr[left], i = left, j = right;
while (i < j) {
while (i < j && arr[j] >= pivot) j--;
arr[i] = arr[j];
while (i < j && arr[i] <= pivot) i++;
arr[j] = arr[i];
}
arr[i] = pivot;
quickSort(arr, left, i - 1);
quickSort(arr, i + 1, right);
}
}
<?php
// PHP 快速排序
function quickSort(array $arr): array {
if (count($arr) <= 1) return $arr;
$pivot = $arr[0];
$left = array_filter(array_slice($arr, 1), fn($x) => $x <= $pivot);
$right = array_filter(array_slice($arr, 1), fn($x) => $x > $pivot);
return array_merge(quickSort($left), [$pivot], quickSort($right));
}
?>
// Go 快速排序
package main
func quickSort(arr []int) []int {
if len(arr) <= 1 {
return arr
}
pivot := arr[0]
left, right := []int{}, []int{}
for _, v := range arr[1:] {
if v <= pivot {
left = append(left, v)
} else {
right = append(right, v)
}
}
left = quickSort(left)
right = quickSort(right)
return append(append(left, pivot), right...)
}
✅ 算法特点与总结
| 属性 | 描述 |
|---|---|
| 时间复杂度 | 平均 O(n log n),最坏 O(n²)(已排序时最差) |
| 空间复杂度 | O(log n)(递归栈)或 O(n)(函数式写法) |
| 稳定性 | ❌ 不稳定 |
| 是否原地排序 | ✅ 可实现原地排序(如 C++/Java 实现) |
⚠️ 提示:快速排序虽然最坏时间复杂度是 O(n²),但在实际中非常高效,建议搭配“三数取中”或随机基准优化其稳定性。
相关内容
- 冒泡排序(Bubble Sort) 冒泡排序是一种基础且易懂的排序算法,适合小规模数据排序。本文提供冒泡排序的算法原理与 JavaScript、Python、C++、Java、PHP、Go 多语言...
- 基数排序(Radix Sort) 基数排序是一种非比较类排序,适用于整数或定长字符串。本文介绍 LSD 方式的基数排序算法,提供 JavaScript、Python、C++、Java、PHP、G...
- 选择排序(Selection Sort) 选择排序是一种简单直观的排序算法,通过反复选择最小元素放到前面实现排序。本文讲解算法原理,并提供 JavaScript、Python、C++、Java、PHP、...
- 插入排序(Insertion Sort) 插入排序是一种简单且高效的排序算法,适合部分有序数组排序。本文介绍算法原理,并提供 JavaScript、Python、C++、Java、PHP、Go 多语言示...
- 希尔排序(Shell Sort) 介绍希尔排序的原理和分组插入策略,适用于中等规模数据。附带 JavaScript、Python、C++、Java、PHP、Go 多语言实现代码,助你深入理解。
- 归并排序(Merge Sort) 介绍归并排序的分治法思想、稳定性特点和适用场景,附带 JavaScript、Python、C++、Java、PHP、Go 多语言实现及详细解析,帮助深入理解。