基本思路是每次在序列中选择一个枢纽,并把这个序列分成左右两部分,左边都小于等于这个枢纽,右边都大于等于这个枢纽,然后再在左边分别排序。
然而如果选的枢纽过于大或者过于小,那么对于一些比较有序的序列,这个算法的复杂度可能会掉到
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");
}