快速排序算法详解:从原理到电商场景实战
1. 算法原理
快速排序(Quick Sort)采用分治思想:
- 基准选择:从数组中选一个元素作为基准(pivot)
- 分区操作:将数组分为两部分,小于基准的放左边,大于基准的放右边
- 递归排序:对左右子数组重复上述过程
时间复杂度:
- 最优/平均:O(n log n)
- 最差(已排序数组):O(n²)
2. 代码实现
Java版本
public void quickSort(int[] arr, int low, int high) {
if (low < high) {
int pivot = partition(arr, low, high);
quickSort(arr, low, pivot - 1);
quickSort(arr, pivot + 1, high);
}
}
private 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++;
swap(arr, i, j);
}
}
swap(arr, i + 1, high);
return i + 1;
}
Python版本
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)
3. 电商场景实战
需求:对商品价格进行实时排序
// 商品类
class Product {
String name;
double price;
// 构造方法省略
}
// 价格排序服务
public class PriceSortService {
public List<Product> sortProducts(List<Product> products) {
// 转换为价格数组
double[] prices = products.stream().mapToDouble(p -> p.price).toArray();
quickSort(prices, 0, prices.length - 1);
// 重建有序商品列表
return Arrays.stream(prices)
.mapToObj(price -> products.stream()
.filter(p -> p.price == price)
.findFirst().get())
.collect(Collectors.toList());
}
// quickSort方法同上
}
4. 算法优化
- 三数取中法:避免最坏时间复杂度
- 尾递归优化:减少栈空间消耗
- 小数组切换插入排序:当数组长度较小时切换更优算法
5. 常见面试题
- 快速排序是否稳定?
- 如何避免最坏时间复杂度?
- 空间复杂度是多少?
答案:不稳定 | 随机化基准选择 | O(log n)递归栈空间