快速排序详细图解分析(含代码示例)

快速排序基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

快速排序总概览图解
设待排数组元素为:4、8、6、9、7、1、3、2、5。
在这里插入图片描述
快速排序的基本思想是划分分治递归
第一步是划分,将整个数组划分为两个部分,第一部分所有值小于基准值,第二部分所以值大于基准值。基准值的选择随机,一般选择待排数组的第一个元素。划分规则在下方。
第二步:分治递归。第一步将数组划分为两部分后,两部分内部还不是有序的,再分别对两部分进行递归快速排序,最终得到一个完整的有序数组。

划分规则
(1)low high指针(索引)分别指向待排数组的首、尾。
(2)low 指针向后遍历,high指针向前遍历。
(3)当high指针指向元素小于基准值时,high指针元素便赋值给low指针元素,完成转移。
(4)当low指针指向元素大于基准值时,low指针元素便赋值给high指针元素,完成转移。
(5)最终当low=high时,遍历结束。

过程图解
(1)high向前遍历,当指向元素大于基准值4时,继续向前遍历,当指向元素小于基准值时,赋值给low
元素。当元素被转移后,代表当前块可被写,逻辑上可以看做是空的。
在这里插入图片描述
在这里插入图片描述
1
在这里插入图片描述
第一步结束后右边第一个小于基准值的元素被放在了左边。
(2)low指针向后遍历,当指向元素小于基准值4时,继续向后遍历,当指向元素大于基准值时,赋值给high元素。
在这里插入图片描述

在这里插入图片描述
第二步结束后左边第一个大于基准值的元素被放在了右边。
(3)High指针继续向前遍历,当遇到小于基准值的元素时,继续赋值给当前的low指针元素。
在这里插入图片描述
在这里插入图片描述
第三步结束后右边第二个小于基准值的元素被放在了左边。
(4)Low指针继续向后遍历,当遇到大于基准值的元素时,继续赋值给当前的High指针元素。
在这里插入图片描述
在这里插入图片描述

第四步结束后左边第二个大于基准值的元素被放在了右边。
(5)High指针继续向前遍历,当遇到小于基准值的元素时,继续赋值给当前的low指针元素。

### 快速排序算法递归实现的详细图解说明 快速排序是一种基于分治法思想的经典排序算法,它通过选取一个基准值(pivot),将数组划分为两部分:一部分小于等于基准值,另一部分大于基准值。接着对这两部分分别递归调用快速排序,最终得到有序序列。 #### 基本概念 快速排序的核心在于单趟排序操作,即如何选择合适的基准值并将数据分区[^2]。通常采用左右指针法完成这一过程。以下是具体步骤: 1. **选定基准值**:一般可以选择第一个元素作为基准值。 2. **划分区间**:利用双指针技术调整数组中的元素位置,使左侧均不大于基准值,右侧均不小于基准值。 3. **递归处理子区间**:针对上述两个子区间重复执行相同的操作直到无法继续分割为止。 #### 图解示例 假设有一个待排序数组 `arr=[8, 4, 7, 9, 3, 2, 6, 5]` ,下面展示其递归过程中每一步的变化情况: 初始状态:`[8, 4, 7, 9, 3, 2, 6, 5]` - 第一次划分: - 设定左边界l=0,右边界r=7,pivot=arr[l]=8. - 移动左右指针直至找到满足条件的位置互换元素(此处省略中间细节),最后结果为:`[5, 4, 7, 6, 3, 2, 8, 9]`,此时div=6. 第二次划分之前的状态变为两个独立区域:[5, 4, 7, 6, 3, 2](<8) 和 [9](>8). 对于左边区域 `[5, 4, 7, 6, 3, 2]` 进行同样的操作... 以此类推,不断缩小范围直至整个列表完全有序。 #### C语言代码实现 下面是完整的C语言版本的递归实现方式: ```c void swap(int *a, int *b){ int t = *a; *a = *b; *b = t; } int partition(int arr[], int low, int high){ int pivot = arr[high]; int i = (low - 1); for (int j = low; j <= high- 1; j++){ if (arr[j] <= pivot){ i++; swap(&arr[i], &arr[j]); } } swap(&arr[i + 1], &arr[high]); return (i + 1); } void quickSort(int arr[], int low, int high){ if (low < high){ int pi = partition(arr, low, high); quickSort(arr, low, pi - 1); quickSort(arr, pi + 1, high); } } ``` 此段程序定义了一个辅助函数用于交换数值以及主要逻辑所在的partition()和quickSort().其中partition负责实际的数据移动与定位新的中心点;而quickSort则控制整体流程并决定何时停止进一步拆分[^4]. #### 性能分析 理论上讲,在理想状况下每次都能均匀分配左右两侧,则总体耗时接近O(n log n)[^3].然而现实中由于输入特性差异可能导致极端情形发生比如已经近乎升序排列的情况下退化至平方级效率O().因此实践中还需考虑其他因素如稳定性需求等因素综合评判选用何种具体的变种形式更为合适。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值