From 2f50f3a91f0f179026851bbe2b34d3f8a9dd292a Mon Sep 17 00:00:00 2001 From: ITCharge Date: Fri, 18 Aug 2023 18:06:00 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BF=AB=E9=80=9F=E6=8E=92=E5=BA=8F=E5=86=85?= =?UTF-8?q?=E5=AE=B9=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../02.Array-Sort/06.Array-Quick-Sort.md | 42 ++++++++++++++----- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/Contents/01.Array/02.Array-Sort/06.Array-Quick-Sort.md b/Contents/01.Array/02.Array-Sort/06.Array-Quick-Sort.md index cc9cdbe1..a076732e 100644 --- a/Contents/01.Array/02.Array-Sort/06.Array-Quick-Sort.md +++ b/Contents/01.Array/02.Array-Sort/06.Array-Quick-Sort.md @@ -7,38 +7,58 @@ ## 2. 快速排序算法步骤 -快速排序算法的步骤可以简单总结为两步:「递归排序」和「哨兵划分」。 - 假设数组的元素个数为 $n$ 个,则快速排序的算法步骤如下: -1. **哨兵划分**:将数组中比基准数大的元素移动到基准数右侧,比他小的元素移动到基准数左侧。 +1. **哨兵划分**:选取一个基准数,将数组中比基准数大的元素移动到基准数右侧,比他小的元素移动到基准数左侧。 1. 从当前数组中找到一个基准数 $pivot$(这里以当前数组第 $1$ 个元素作为基准数,即 $pivot = nums[low]$)。 2. 使用指针 $i$ 指向数组开始位置,指针 $j$ 指向数组末尾位置。 3. 从右向左移动指针 $j$,找到第 $1$ 个小于基准值的元素。 4. 从左向右移动指针 $i$,找到第 $1$ 个大于基准数的元素。 - 5. 交换指针 $i$、指针 $j$ 指向的两个元素。 + 5. 交换指针 $i$、指针 $j$ 指向的两个元素位置。 6. 重复第 $3 \sim 5$ 步,直到指针 $i$ 和指针 $j$ 相遇时停止,最后将基准数放到两个子数组交界的位置上。 -2. **递归排序**:按照同样的方式递归的对两个子数组分别进行快速排序。 +2. **递归分解**:完成哨兵划分之后,对划分好的左右子数组分别进行递归排序。 1. 按照基准数的位置将数组拆分为左右两个子数组。 - 2. 对每个子数组分别重复「哨兵划分」和「递归排序」,直到各个子数组只有 $1$ 个元素,排序结束。 + 2. 对每个子数组分别重复「哨兵划分」和「递归分解」,直到各个子数组只有 $1$ 个元素,排序结束。 -接下来,我们以 $[4, 7, 5, 2, 6, 1, 3]$ 为例,演示一下快速排序的「哨兵划分」和「递归排序」。 +接下来,我们以 $[4, 7, 5, 2, 6, 1, 3]$ 为例,演示一下快速排序的整个步骤。 -### 2.1 哨兵划分 +我们先来看一下单次「哨兵划分」的过程。 -::: tabs#quickSort +::: tabs#partition @tab <1> +![哨兵划分 1](http://qcdn.itcharge.cn/images/20230818175908.png) + @tab <2> +![哨兵划分 2](http://qcdn.itcharge.cn/images/20230818175922.png) + @tab <3> -::: +![哨兵划分 3](http://qcdn.itcharge.cn/images/20230818175952.png) + +@tab <4> + +![哨兵划分 4](http://qcdn.itcharge.cn/images/20230818180001.png) + +@tab <5> -### 2.2 递归排序 +![哨兵划分 5](http://qcdn.itcharge.cn/images/20230818180009.png) + +@tab <6> + +![哨兵划分 6](http://qcdn.itcharge.cn/images/20230818180019.png) + +@tab <7> + +![哨兵划分 7](http://qcdn.itcharge.cn/images/20230818180027.png) + +::: +在经过一次「哨兵划分」过程之后,数组就被划分为左子数组、基准数、右子树组三个独立部分。接下来只要对划分好的左右子数组分别进行递归排序即可完成排序。整个步骤如下: +![快速排序](http://qcdn.itcharge.cn/images/20230818153642.png) ## 3. 快速排序代码实现