快速排序完全指南:原理+代码+电商价格排序实战(Java/Python)

114 阅读2分钟

快速排序算法详解:从原理到电商场景实战

1. 算法原理

快速排序(Quick Sort)采用分治思想:

  1. 基准选择:从数组中选一个元素作为基准(pivot)
  2. 分区操作:将数组分为两部分,小于基准的放左边,大于基准的放右边
  3. 递归排序:对左右子数组重复上述过程

时间复杂度:

  • 最优/平均: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. 常见面试题

  1. 快速排序是否稳定?
  2. 如何避免最坏时间复杂度?
  3. 空间复杂度是多少?

答案:不稳定 | 随机化基准选择 | O(log n)递归栈空间