要求:
手撕快排,用于个人复习。
这玩意隔一段时间不写就容易出错,警钟长鸣。
出错点:
(1)返回值类型是 void ,可不可以是 vector<int> ?
(2)如果是void,传入参数的 vector 就要写成引用;
(3)最外层是 while(left < right) , 内层也是 while(left < right) ,因为在大while中的每轮循环都有可能导致 left >= right ;
(3)交换数据时,不是 swap() 而是赋值,因为交换数据的条件是单方面的(left 指针找到比 pivot 大的或者 right 指针找到比 pivot 小的),如果两边都比 pivot 大 或者都比 pivot 小,就会导致永远在重复 swap();
(4)递归时的边界是 left - 1 和 right + 1,因为一轮排序结束时 left == right 且 arr[left] == arr[right] == pivot ,pivot已经没必要加入下一轮排序了。
代码:(懒得写注释了)
// 快速排序
#include <iostream>
#include <vector>
using namespace std;
void quickSort(vector<int>& arr, int begin, int end) {
if (begin >= end) {
return;
}
int pivot = arr[begin];
int left = begin;
int right = end;
while (left < right) {
while (left < right && arr[right] >= pivot) {
--right;
}
// 此处判断是重点
if (left < right) {
arr[left] = arr[right];
}
while (left < right && arr[left] <= pivot) {
++left;
}
if (left < right) {
arr[right] = arr[left];
}
}
arr[left] = pivot;
quickSort(arr, begin, left - 1);
quickSort(arr, right + 1, end);
}
int main() {
vector<int> v = {1, 1, 4, 5, 1, 4, 1, 9, 1, 9, 8, 1, 0};
quickSort(v, 0, 12);
for (auto info : v) {
cout << info << " ";
}
cout << endl;
return 0;
}0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复