·这里用的算法导论中的快排模板,双指针,具体划分操作,通过两个指针i,j,标杆pivot=nums[r],j遍历整个区间,i为左部分指针,每次将nums中小于pivot的数交换到区间左部分,然后知道遍历完整个区间,将pivot数与大于这个区间的第一个数交换,即完成整个partition过程
加random防止达到最坏时间复杂度o(n2),经算法导论证明平均时间复杂度可达到o(nlogn)
#include <bits/stdc++.h>
#define show2(a,b) cout<<a<<" "<<b<<endl;
#define show3(a,b,c) cout<<a<<" "<<b<<" "<<c<<endl;
using namespace std;
int partition ( int l, int r, vector<int>& nums )
{
int t = rand() % ( r - l + 1 ) + l;
swap ( nums[r], nums[t] );
int j = l - 1;
int k = nums[r];
for ( int i = l; i < r; i++ )
{
if ( nums[i] < k ) swap ( nums[++j], nums[i] );
}
swap ( nums[j + 1], nums[r] );
return j + 1;
}
void quicksort ( int l, int r, vector<int>& nums )
{
if ( l <= r )
{
int k = partition ( l, r, nums );
quicksort ( l, k - 1, nums );
quicksort ( k + 1, r, nums );
}
}
vector<int> sortArray ( vector<int>& nums )
{
srand ( time ( 0 ) );
quicksort ( 0, nums.size() - 1, nums );
return nums;
}
int main()
{
vector<int> a = {5,4,3,1};
a = sortArray ( a );
for ( auto x : a )
cout << x << " ";
}