思路:
-
选择一个基准值,通常是数组中的第一个元素。
-
将数组分为两部分,一部分是小于基准值的元素,另一部分是大于基准值的元素。
-
对这两部分分别进行递归排序,直到子数组长度为 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,以及基准值 baseint 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;
}