用C++ 实现快速排序

之前经常“手撕”快速排序的代码毫无感觉,因为用C语言写的还不错,就没有试过其他的方法,后来很久没写,,终于又有一天“ 同学,写一个快排的代码吧 ”,,我竟然栽在快排上了!!
经过此次痛苦的教训,我再次用C++写一遍

#include <iostream>
#include <vector>
using namespace std;

//int PartSort(vector<int> &v,int left,int right)
//{
//	int key = left;      //以左边的第一个数为基值
//	while (left<right)
//	{
//		while (left<right&&v[right] >= v[key])   //先从右向左找
//			right--;
//		while (left<right&&v[left] <= v[key])  //再从左向右找
//			left++;
//		swap(v[left], v[right]);    //找到以后交换两个值
//	}
//	swap(v[left], v[key]);   //将基值放在中间
//	return left;    //返回下一个基值
//}
//void QuickSort(vector<int>& v,int left,int right)     //左右指针法
//{
//	if (left>right)
//		return ;
//	int i = PartSort(v, left, right);    //找到基值
//	QuickSort(v, left, i-1);   //对左半部分递归排序
//	QuickSort(v, i+1, right);  //对右半部分递归排序
//}

void quickSort(vector<int> &num, int l, int r)     //挖坑法
{
	if (l >= r)     //先检查左右条件
		return;
	int i = l, j = r, x = num[l];
	while (i < j) {
		while (i < j && num[j] >= x)//从右向左找到第一个小于x的
			j--;
		if (i < j)
			num[i++] = num[j];//填坑之后i++
		while (i < j && num[i] <= x)//从左向右找第一个大于x的数
			i++;
		if (i < j)
			num[j--] = num[i];
	}
	num[i] = x;     //把最开始取出来的x放到i处
	quickSort(num, l, i - 1);//以i为中间值,分左右两部分递归调用
	quickSort(num, i + 1, r);
}


int main()
{
	vector<int> v = {1,3,6,4,5,8,2};
	quickSort(v,0,v.size()-1);
	for (auto &e : v)
		cout <<e<< " ";
	system("pause");
	return 0;
}

这些基础千万不要小瞧啊。

猜你喜欢

转载自blog.csdn.net/ly_6699/article/details/101125733