快速排序算法详解

算法思想

快速排序是一种高效的排序算法,采用分治策略​(Divide and Conquer)。它的基本思想是:

  1. 选择一个基准元素(pivot)

  2. 将数组分区,使得所有小于基准的元素都在其左侧,所有大于基准的元素都在其右侧

  3. 递归地对左右两个子数组进行快速排序

算法步骤

  1. 选择基准​:从数组中选择一个元素作为基准(pivot)

  2. 分区操作​:重新排列数组,使所有小于基准的元素放在基准前面,所有大于基准的元素放在基准后面

  3. 递归排序​:递归地将上述过程应用于基准左右两侧的子数组

Java实现

复制代码
public class QuickSort {
    
    // 快速排序入口方法
    public static void quickSort(int[] arr) {
        if (arr == null || arr.length == 0) {
            return;
        }
        quickSort(arr, 0, arr.length - 1);
    }
    
    // 递归快速排序
    private static void quickSort(int[] arr, int low, int high) {
        if (low < high) {
            // 分区操作,返回基准的索引位置
            int pivotIndex = partition(arr, low, high);
            
            // 递归排序左半部分
            quickSort(arr, low, pivotIndex - 1);
            
            // 递归排序右半部分
            quickSort(arr, pivotIndex + 1, high);
        }
    }
    
    // 分区函数
    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++;
                // 交换arr[i]和arr[j]
                swap(arr, i, j);
            }
        }
        
        // 将基准元素放到正确位置
        swap(arr, i + 1, high);
        
        return i + 1;
    }
    
    // 交换数组中两个元素的位置
    private static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
    
    // 测试代码
    public static void main(String[] args) {
        int[] arr = {64, 34, 25, 12, 22, 11, 90};
        
        System.out.println("排序前的数组:");
        printArray(arr);
        
        quickSort(arr);
        
        System.out.println("排序后的数组:");
        printArray(arr);
    }
    
    // 打印数组
    private static void printArray(int[] arr) {
        for (int value : arr) {
            System.out.print(value + " ");
        }
        System.out.println();
    }
}

时间复杂度分析

  • 最佳情况​:O(n log n) - 每次分区都能将数组均匀分成两部分

  • 平均情况​:O(n log n)

  • 最坏情况​:O(n²) - 当数组已经有序或逆序,且选择最边缘的元素作为基准时

空间复杂度

  • 平均情况下:O(log n) - 递归调用栈的空间

  • 最坏情况下:O(n) - 需要n层递归调用

优化策略

  1. 随机选择基准​:随机选择基准元素可以避免最坏情况的发生

  2. 三数取中法​:选择第一个、中间和最后一个元素的中值作为基准

  3. 小数组使用插入排序​:当子数组规模较小时(如<10),使用插入排序更高效

  4. 尾递归优化​:减少递归深度

算法特点

  • 不稳定排序​:相等元素的相对位置可能会改变

  • 原地排序​:只需要常数级的额外空间

  • 实践中最快​:尽管最坏情况时间复杂度较高,但在实际应用中通常是最快的排序算法

快速排序因其高效性和实用性,被广泛应用于各种编程语言和系统的排序实现中。

相关推荐
手握风云-1 小时前
优选算法的寻踪契合:字符串专题
算法
闭着眼睛学算法1 小时前
【华为OD机考正在更新】2025年双机位A卷真题【完全原创题解 | 详细考点分类 | 不断更新题目 | 六种主流语言Py+Java+Cpp+C+Js+Go】
java·c语言·javascript·c++·python·算法·华为od
IT古董1 小时前
【第五章:计算机视觉-项目实战之目标检测实战】2.目标检测实战:中国交通标志检测-(2)中国交通标志检测数据格式转化与读取
算法·目标检测·计算机视觉
MobotStone1 小时前
LLM 采样入门到进阶:理解与实践 Top-K、Top-P、温度控制
算法
杨小码不BUG2 小时前
CSP-J/S初赛知识点精讲-图论
c++·算法·图论··编码·csp-j/s初赛
LeaderSheepH3 小时前
常见的排序算法
数据结构·算法·排序算法
周杰伦_Jay4 小时前
【图文详解】强化学习核心框架、数学基础、分类、应用场景
人工智能·科技·算法·机器学习·计算机视觉·分类·数据挖掘
violet-lz4 小时前
Linux静态库与共享库(动态库)全面详解:从创建到应用
算法
贝塔实验室4 小时前
ADMM 算法的基本概念
算法·数学建模·设计模式·矩阵·动态规划·软件构建·傅立叶分析
235164 小时前
【LeetCode】3. 无重复字符的最长子串
java·后端·算法·leetcode·职场和发展