void Qsort(int arr[], int begin, int end) {
// 递归终止条件:如果子数组长度小于等于1,则已经有序
if (begin >= end) return;
// 选择第一个元素作为基准值
int val = arr[begin];
int left = begin; // 左指针
int right = end; // 右指针
// 分区过程:将小于基准的放左边,大于基准的放右边
while (left < right) {
// 从右向左找到第一个小于基准值的元素
while (left < right && arr[right] >= val) {
right--;
}
// 将找到的元素放到左指针位置
arr[left] = arr[right];
// 从左向右找到第一个大于基准值的元素
while (left < right && arr[left] <= val) {
left++;
}
// 将找到的元素放到右指针位置
arr[right] = arr[left];
}
// 将基准值放到最终位置
arr[left] = val;
// 递归排序左子数组
Qsort(arr, begin, left - 1);
// 递归排序右子数组
Qsort(arr, left + 1, end);
}
快排优化方式:
1.在一定范围内用插入排序的方式
2.三数取中法,以此作为基准值