Skip to content

Commit

Permalink
快速排序内容优化
Browse files Browse the repository at this point in the history
  • Loading branch information
itcharge committed Aug 18, 2023
1 parent 5165be8 commit 2f50f3a
Showing 1 changed file with 31 additions and 11 deletions.
42 changes: 31 additions & 11 deletions Contents/01.Array/02.Array-Sort/06.Array-Quick-Sort.md
Original file line number Diff line number Diff line change
Expand Up @@ -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. 快速排序代码实现

Expand Down

0 comments on commit 2f50f3a

Please sign in to comment.