引言
交换排序是算法设计中的经典范式。其中,快速排序以高效著称,而冒泡排序则以逻辑简单闻名。本文将深入解析快速排序的三种递归实现和非递归版本,通过图示和代码详细讲解分区过程,并与冒泡排序进行多维度性能对比,帮助读者全面理解两种算法的优劣与适用场景。
一、介绍交换排序
基本思想是通过比较序列中的两个元素,若顺序错误则交换位置,逐步将元素移动到正确位置。
排序特点:
- 原地操作数组元素;
- 构建升序或降序序列。
二、高效交换——快速排序(递归版)
2.1 背景与思想
快速排序由 Hoare 于 1962 年提出,旨在解决当时主流算法的痛点:冒泡等简单算法效率低(O(N²)),而归并等高效算法占用额外空间大。
其核心思想是:任取待排序序列中的某元素作为基准值(key),将集合分割成两子序列,左子序列所有元素均小于基准值,右子序列所有元素均大于基准值,然后对左右子序列重复该过程,直到有序。
2.2 二叉树结构框架
基于递归结构,我们需要定义 left 和 right 来界定区间。大致框架如下:
// 快速排序 - 二叉树结构主体框架
void QuickSort(int* arr, int left, int right) {
if (left >= right) return;
// 获取 key:单次分区
int key = _QuickSort(arr, left, right);
// 递归排序
QuickSort(arr, left, key - 1); // 左子序列
QuickSort(arr, key + 1, right); // 右子序列
}
三、找基准值 key 的三种递归实战方法
3.1 Hoare 版本
思路: 创建左右指针,确定基准值。从右向左找比基准小的数,从左向右找比基准大的数,找到后交换。
3.1.1 图解分析
初始时 left 在最左,right 在最右。默认 为初始 位置的值, 先自增。在大循环中, 找大数, 找小数,条件为 。当两者都跳出内层循环且未越界时交换数值。最后 时,交换 与 完成基准定位。


