class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 将给定数组排序
     * @param arr int整型vector 待排序的数组
     * @return int整型vector
     */
    // 使用递归形式的递归排序
    void Merge(vector<int>& arr, int l, int q, int r) {
        int left = l, right = q + 1;
        int temp[r - l + 1]; // 辅助函数
        int i = 0;
        // 三个while循环,进行两组数的逐个判断录入
        while(left <= q && right <= r) {
            temp[i++] = arr[left] <= arr[right] ? arr[left++] : arr[right++];
        }
        while(left <= q) {
            temp[i++] = arr[left++];
        }
        while(right <= r) {
            temp[i++] = arr[right++];
        }
        // 辅助数组填充完毕,直接循环赋给原数组
        for(int j = 0; j < i; ++j) {
            arr[l + j] = temp[j];
        }
    }


    void MergeSort(vector<int>& arr, int l, int r) {
        if (l == r) {
            return ;
        }
        // 对半划分
        int q = (l + r) / 2;
        // 子问题1和2
        MergeSort(arr, l, q);
        MergeSort(arr, q + 1, r);
        // 合
        Merge(arr, l, q, r);
    }


    vector<int> MySort(vector<int>& arr) {
        int len = arr.size();
        MergeSort(arr, 0, len - 1);
        return arr;
    }
};