要求:

手撕快排,用于个人复习。

这玩意隔一段时间不写就容易出错,警钟长鸣。


出错点:

(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.0分

2 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论