思路:
-
选择一个基准值,通常是数组中的第一个元素。
-
将数组分为两部分,一部分是小于基准值的元素,另一部分是大于基准值的元素。
-
对这两部分分别进行递归排序,直到子数组长度为 1 或 0。
-
合并排序好的两部分,得到最终排序结果。
具体实现:
-
定义两个指针 i 和 j,分别指向数组的左右两端。
-
从右向左找到第一个小于基准值的元素,从左向右找到第一个大于基准值的元素,将它们进行交换。
-
重复执行步骤 2,直到 i 和 j 相遇。
-
将基准值与位置 i 上的元素交换,此时基准值已经放置到正确的位置上。
-
对基准值左边和右边的子数组分别进行递归排序。
-
合并排序好的两部分,得到最终排序结果。
代码:
#include<iostream>
using namespace std;
// 快速排序算法
void qsort(int a[], int left, int right) {
// 判断是否需要继续排序
if (left >= right) {
return;
}
// 初始化指针 i 和 j,以及基准值 base
int i = left, j = right;
int base = a[left];
// 开始快速排序的一轮操作
while (i < j) {
// 从右向左找到第一个小于基准值的元素
while (i < j && a[j] >= base) j--;
// 从左向右找到第一个大于基准值的元素
while (i < j && a[i] <= base) i++;
// 将这两个元素进行交换
swap(a[i], a[j]);
}
// 将基准值放到正确的位置上
swap(a[left], a[i]);
// 递归对基准值左边的数组进行排序
qsort(a, left, j - 1);
// 递归对基准值右边的数组进行排序
qsort(a, j + 1, right);
}
// 主函数
int main() {
// 定义一个数组
int a[] = { 4, 8, 2, 7, 9, 5 };
// 数组长度
int n = sizeof(a) / sizeof(a[0]);
// 对数组进行快速排序
qsort(a, 0, n - 1);
// 输出排序后的结果
for (int i = 0; i < n; i++) {
cout << a[i] << " ";
}
// 返回 0,表示程序正常退出
return 0;
}