class Solution {
public:
    void quickSort(vector<int>& arr, int left, int right) {
        if(left >= right) // 递归中断条件
            return;
        int mid_value = arr[right]; //选取最后一位作为主元值
        int last_pos = left - 1; //介于left和last_pos之间的数小于等于主元值,记为小区间,last_pos是小区间的末位,此时还没有数在小区间内所以要减1
        for(int cur = left; cur <= right - 1; cur++) { //对除最后一个主元外的前面的所有数依次判定其放不放入小区间
            if(arr[cur] <= mid_value) { //当前位置上的值小于等于主元值时
                last_pos++; //为小区间开辟下一个位置(该位置可能就是当前位置)
                swap(arr[last_pos], arr[cur]); //将当前位置上的数和新开辟的小区间末位上的数交换
            }
        }
        swap(arr[++last_pos], arr[right]); //继续开辟位置将主元放入,此时主元为小区间末位,并且后面的数都大于主元值(如果有的话)
        quickSort(arr, left, last_pos - 1); //主元左边的数组进行递归
        quickSort(arr, last_pos + 1, right); //主元右边的数组进行递归
    }

    vector<int> MySort(vector<int>& arr) {
        if(arr.size() <= 1) //过滤简单情况
            return arr;
        quickSort(arr, 0, arr.size() - 1);
        return arr;
    }
};