数据结构自学Day13 -- 快速排序--“前后指针法”

快速排序的 "前后指针法"(也称为"Hoare划分方案"或"双指针遍历法")是一种实现 partition(划分) 的思路,它与"挖坑法"不同,利用两个指针分别扫描元素并交换,从而实现原地划分。

往期"快速排序算法回顾":

快速排序--挖坑法
快速排序-- 分而治之

🧠 "前后指针"思想

"前后指针法"指的是:
用两个指针(cur 和 prev),一个扫描数组,一个标记小于 pivot 的"边界",通过遍历和交换,把比 pivot 小的元素移到前面,比 pivot 大的放后面,最后把 pivot 放到中间。

🧩 思路详解

假设存在一个数组

  • 数组为 arrleft..right

  • 选择 arrright 为基准值(pivot);

  • prev 初始化为 left - 1,指向已处理的最后一个小于 pivot 的元素

  • cur 从 left 开始遍历到 right - 1,用于寻找比pivot小的元素。

🤔思维导图

代码实现

cpp 复制代码
int PartSort3(int* arr,int left,int right){
    assert(arr);
    int mid_index = get_midindex(arr,left,right);
    Swap(&arr[mid_index],&arr[right]);
    int key = arr[right];
    int prev = left-1;
    for(int cur = left;cur<right;++cur){
        if(arr[cur]<key){
            prev++;
            Swap(&arr[cur],&arr[prev]);
        }
    }
    //可选while循环
    // while (cur< right){
    //     if(arr[cur]<key)
    //     {
    //         prev++;
    //         Swap(&arr[cur],&arr[prev]);
    //     }
    //     cur++;
    // }
    prev++;
    Swap(&arr[right],&arr[prev]);
    return prev;
}

快速排序算法总结:

  1. 分而治之的排序思想(标准快排)

  2. 挖坑法(Hoare分区法)

  3. 前后指针法(Lomuto分区法)

它们本质上都基于快速排序的"分而治之"思想 ,但实现方式不同,影响效率与处理方式也有所区别

实现方式 本质思想 分区原理 枢轴选取 优势 劣势 适用场景
分而治之 框架思想 递归分为左右两部分 自由选择 算法核心思维,通用 本身不包含具体实现 统一指导各类快排
挖坑法 Hoare 分区法 左右指针互相填坑 一般选最左 交换少,性能好 易错,不能选两端作为枢轴 重复元素较多,追求效率
前后指针法 Lomuto 分区法 逐个遍历,用前后指针交换 一般选最右 逻辑清晰,容易写 交换次数多,性能略逊 学习入门、小数据或调试
相关推荐
彧azz1 小时前
算法设计与分析:贪心与动态规划
数据结构·学习·算法·贪心算法·动态规划
Beyond_System|系统之外2 小时前
【学编程】Python基础编程题100道(21-60)
开发语言·python·算法
景熙55232 小时前
15.Java 8 Stream 流入门到实战
java·开发语言·数据结构
漂流瓶jz4 小时前
UVA-1442 洞穴 题解答案代码 算法竞赛入门经典第二版
c++·算法·题解·aoapc·算法竞赛入门经典·uva
圣保罗的大教堂4 小时前
leetcode 835. 图像重叠 中等
leetcode
叠层归一研究院5 小时前
基于极限自指的叠层归一宇宙结构理论——无元外部封闭系统的内生区分模型
人工智能·经验分享·算法·agi
Selvaggia6 小时前
Diffusion Model 的基本原理与模型架构
算法
wabs6667 小时前
关于二叉树【力扣572.另一棵树的子树的思考】
数据结构·c++·算法·leetcode·二叉树
hanlin037 小时前
刷题笔记:力扣第41题-缺失的第一个正数
笔记·算法·leetcode
shehuiyuelaiyuehao8 小时前
算法50,分治归并,数组中的逆序对
java·算法