//1 1 4 2 1 3 2 4
class Solution {
public:
//left as pivot
int partition2(vector<int> &arr, int l, int r){
const int low_idx=l, pivot=arr.at(low_idx);
int c_idx=r, pivot_idx=r+1;
while(c_idx>l){
if(arr.at(c_idx)>pivot){
std::swap(arr.at(--pivot_idx), arr.at(c_idx));
}
c_idx--;
}
std::swap(arr.at(pivot_idx-1), arr.at(low_idx));
return pivot_idx-1;
}
//right as pivot
int partition1(vector<int> &arr, int l, int r){
const int high_idx=r, pivot=arr.at(high_idx);
int c_idx=l, pivot_idx=l-1;
while(c_idx<r){
if(arr.at(c_idx)<=pivot){
std::swap(arr.at(++pivot_idx), arr.at(c_idx));
}
c_idx++;
}
std::swap(arr.at(pivot_idx+1), arr.at(high_idx));
return pivot_idx+1;
}
//middle as pivot
int partition(vector<int> &arr, int l, int r){
const int mid_idx=(l+r)/2, pivot=arr.at(mid_idx);
int c_idx=l, pivot_idx=l-1, new_mid_idx=mid_idx;
while(c_idx <= r){
if(arr.at(c_idx)<=pivot){
std::swap(arr.at(++pivot_idx), arr.at(c_idx));
if(c_idx==mid_idx){
new_mid_idx=pivot_idx;
}
}
c_idx++;
}
std::swap(arr.at(pivot_idx), arr.at(new_mid_idx));
return pivot_idx;
}
void quickSort(vector<int> &arr, int l, int r){
if(l<r){
int pivot_idx=partition2(arr,l,r);
quickSort(arr, l, pivot_idx-1);
quickSort(arr, pivot_idx+1, r);
}
}
};