#include <iostream>
#include <ctime>
#include <algorithm>
using namespace std;
// 递归的三路快速排序算法
template <typename T>
void __quickSort3Ways(T arr[], int l, int r){
if( l >= r){
return;
}
swap(arr[l], arr[rand()%(r-l+1)+l]);
T v = arr[l];
int lt = l; // arr[l+1...lt] < v
int gt = r + 1; // arr[gt...r] > v
int i = l + 1; // arr[lt+1...i) == v
while( i < gt){
if(arr[i] < v){
swap(arr[i], arr[lt + 1]);
i++;
lt++;
}
else if( arr[i] > v){
swap(arr[i], arr[gt - 1]);
gt--;
}
else{ // arr[i] == v
i++;
}
}
swap(arr[l], arr[lt]);
__quickSort3Ways(arr, l, lt - 1);
__quickSort3Ways(arr, gt, r);
}
template <typename T>
void quickSort3Ways(T arr[], int n){
srand(time(NULL));
__quickSort3Ways(arr, 0, n-1);
}
int main(){
int arr[] = {3,1,4,5,3,3,3,3,3,3,4,5};
quickSort3Ways(arr,12);
for(int i = 0; i<12; i++){
cout<<arr[i]<<" ";
}
cout<<endl;
return 0;
}