快速排序 实现

基本思路是每次在序列中选择一个枢纽,并把这个序列分成左右两部分,左边都小于等于这个枢纽,右边都大于等于这个枢纽,然后再在左边分别排序。
然而如果选的枢纽过于大或者过于小,那么对于一些比较有序的序列,这个算法的复杂度可能会掉到 O ( n 2 ) O(n^2) O(n2) ,所以随机选一个为枢纽。实操在数据量为十万级时基本可以秒出答案。

#include <iostream>
#include <vector>
#include <array>
#include <algorithm>
#include<ctime>
using namespace std;
typedef long long ll;
const int m = 4;
int part_sort(vector<int>&v,int left,int right);
void q_sort(vector<int>&v,int left,int right)
{

	if(left>=right) return;
	int index=part_sort(v,left,right);
	q_sort(v,left,index-1);
	q_sort(v,index+1,right);
}
int part_sort(vector<int>&v,int left,int right)
{
	int pos=rand()%(right-left)+left;
	swap(v[pos],v[right]);
	int &key=v[right];
	while(left<right)
	{
		while(left<right&&v[left]<=key)
		{
			left++;
		}
		while(left<right&&v[right]>=key)
		{
			right--;
		}
		swap(v[left],v[right]);
	}
	swap(v[left],key);
	return left;
}
int main()
{
	srand((unsigned int)time(0));
	vector<int>vv={2,0,2,1,1,0};
	q_sort(vv,0,(int)vv.size()-1);
	for(auto i:vv)
	{
		cout<<i<<' ';
	}
	puts("");
	system("pause");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值