交换排序基础
交换排序是算法世界的重要组成部分。其核心思想是通过比较序列中的两个元素,若顺序错误则交换位置,逐步将元素移动到正确位置。
高效交换:快速排序(递归版)
基本思想
快速排序由 Hoare 于 1962 年提出,旨在解决简单算法效率低(O(N²))和归并排序占用空间大的问题。其基本思想是任取一个基准值(key),将待排序集合分割成两子序列:左子序列所有元素均小于基准值,右子序列所有元素均大于基准值。随后对左右子序列重复该过程,直到所有元素排列到位。
由于基于二叉树结构,实现通常采用递归。
// 快速排序主体框架
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); // 右子序列
}
寻找基准值的三种方法
1. Hoare 版本
思路: 创建左右指针,确定基准值。从右向左找比基准小的数,从左向右找比基准大的数,找到后交换。
图解:

代码实现:
// 获取基准值 -- Hoare 版本
int _QuickSort(int* arr, int left, int right) {
int key = left; // 默认为初始 left 值
left++;
while (left <= right) {
(left <= right && arr[right] > arr[key]) {
right--;
}
(left <= right && arr[left] < arr[key]) {
left++;
}
(left <= right) {
Swap(&arr[right], &arr[left]);
}
}
Swap(&arr[key], &arr[right]);
right;
}




