快速排序(Quick Sort)详解与图解

快速排序(Quick Sort)是一种**分治思想(Divide and Conquer)**的经典算法,也是面试与嵌入式开发中最常用的排序算法之一。

本文通过详细代码、逐步图解和运行示例,带你从零彻底理解快速排序。


一、快速排序的基本思想

快速排序的核心思想非常简洁:

"取一个基准数(pivot)

把数组分成两边:左边比它小,右边比它大,

然后对两边继续递归排序。"

重复这个过程,直到每一段只剩一个元素,整个数组自然有序。


二、代码实现(Hoare 双指针分区法)

复制代码
void quick_sort(int a[], int l, int r) {
    // 递归结束条件
    if (l >= r) return;

    // 定义两个指针
    int i = l - 1, j = r + 1;
    // 选择中间值为基准
    int pivot = a[(l + r) / 2];

    // 一次划分
    while (i < j) {
        do i++; while (a[i] < pivot);
        do j--; while (a[j] > pivot);
        if (i < j) {
            int temp = a[i];
            a[i] = a[j];
            a[j] = temp;
        }
    }

    // 递归左右两部分
    quick_sort(a, l, j);
    quick_sort(a, j + 1, r);
}

三、算法过程图解

示例数组:

[6, 1, 2, 7, 9, 3, 4, 5, 10, 8]


Step 1:第一次划分(pivot = 9)

[6, 1, 2, 7, 9, 3, 4, 5, 10, 8]

pivot = 9 ↙----------------↘

[6, 1, 2, 7, 8, 3, 4, 5] [10, 9]

左边都比 9 小,右边都比 9 大。


Step 2:第二次划分(左区 pivot = 7)

[6, 1, 2, 7, 8, 3, 4, 5]

pivot = 7 ↙------------↘

[6, 1, 2, 3, 4, 5] [8]


Step 3:第三次划分(左区 pivot = 3)

[6, 1, 2, 3, 4, 5]

pivot = 3 ↙------↘

[1, 2] [4, 5, 6]


Step 4:右区划分(pivot = 10)

10, 9

pivot = 10

↙----↘

9\] \[


四、递归返回与最终排序结果

当所有区间长度缩小为 1 时,递归开始返回:

[1, 2] + [3] + [4, 5, 6] = [1, 2, 3, 4, 5, 6]

[1, 2, 3, 4, 5, 6] + [7] + [8] = [1, 2, 3, 4, 5, 6, 7, 8]

[1, 2, 3, 4, 5, 6, 7, 8] + [9] + [10] = ✅ [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

最终结果:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

相关推荐
2401_841495643 小时前
【LeetCode刷题】寻找重复数
数据结构·python·算法·leetcode·链表·数组·重复数
罗技1234 小时前
Easysearch 集群监控实战(下):线程池、索引、查询、段合并性能指标详解
前端·javascript·算法
一路往蓝-Anbo4 小时前
C语言从句柄到对象 (七) —— 给对象加把锁:RTOS 环境下的并发安全
java·c语言·开发语言·stm32·单片机·嵌入式硬件·算法
中國龍在廣州4 小时前
谈谈2025年人工智能现状及发展趋势分析
人工智能·深度学习·算法·自然语言处理·chatgpt·机器人·机器人学习
Joe_Blue_024 小时前
Matlab入门案例介绍—常用的运算符及优先级
开发语言·数据结构·matlab·matlab基础入门案例介绍
C雨后彩虹4 小时前
二维伞的雨滴效应
java·数据结构·算法·华为·面试
一路往蓝-Anbo4 小时前
C语言从句柄到对象 (八) —— 当对象会说话:观察者模式与事件链表
c语言·开发语言·数据结构·stm32·单片机·观察者模式·链表
Stanford_11065 小时前
【2026新年启程】学习之路,探索之路,技术之路,成长之路……都与你同行!!!
前端·c++·学习·微信小程序·排序算法·微信开放平台
youngee115 小时前
hot100-60子集
数据结构·算法
郝学胜-神的一滴5 小时前
Linux线程属性设置分离技术详解
linux·服务器·数据结构·c++·程序人生·算法