林惜城


私信TA

用户名:reminder

访问量:27200

签 名:

等  级
排  名 94
经  验 8429
参赛次数 0
文章发表 95
年  龄 0
在职情况 学生
学  校 西安电子科技大学
专  业

  自我简介:

哈姆



要求:

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

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


出错点:

(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 人评分

  评论区