//快速排序 关键在于 partition函数,可以自己参考一个模板,我这个参考大话数据结构

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 将给定数组排序
     * @param arr int整型vector 待排序的数组
     * @return int整型vector
     */
    //1.快速排序
    vector<int> MySort(vector<int>& arr) {

        int start=0;
        int end=arr.size()-1;

        MySortCore(arr,start,end);
        return arr;
    }
    void MySortCore(vector<int>&arr,int start,int end){
        if(start<end){
            int pivot=partiton(arr,start,end);
            MySortCore(arr,start,pivot-1);
            MySortCore(arr,pivot+1,end);
        }

    }
    int partiton(vector<int>&arr,int start,int end){
        int left=start;
        int right=end;
        int pivotKey=arr[left];

        while(left<right){
            while(left<right && arr[right]>=pivotKey)
                --right;
            arr[left]=arr[right];

            while(left<right && arr[left]<=pivotKey)
                ++left;
            arr[right]=arr[left];
        }
        arr[left]=pivotKey;

        return left;
    }
};

//归并排序 关键在于构造一个数组 然后merge,所以这个 merge函数是关键
class Solution {
public:
    //归并排序
    vector<int> MySort(vector<int>& arr) {
        MySortCore(arr,0,arr.size()-1);


        return arr;
    }
    void MySortCore(vector<int>&arr,int start,int end){
        if(start>=end) return;

        int middle=start+((end-start)>>1);
        MySortCore(arr,start,middle);
        MySortCore(arr,middle+1,end);

        Merge(arr,start,middle,end);
    }
    void Merge(vector<int>&arr,int start,int middle,int end){
        int* tmp=new int[end-start+1];

        int left=start;
        int right=middle+1;

        int pTmp=0;    //辅助数组指针
        while(left<=middle && right<=end){
            if(arr[left]<arr[right])
                tmp[pTmp++]=arr[left++];
            else
                tmp[pTmp++]=arr[right++];

        }
        while(left<=middle)
            tmp[pTmp++]=arr[left++];
        while(right<=end)
            tmp[pTmp++]=arr[right++];

        //排序完数组拷贝回原数组
        for(int i=0;i<end-start+1;i++)
            arr[start+i]=tmp[i];

    }
};
//堆排序,分为两步,建堆+排序
//一些细节可以参考大话数据结构
//我这个堆是从下标为0开始的,所以左子节点 left=2*root+1, right=2*root+1

class Solution {
public:
    //堆排序
    void Swap(int&a,int &b){
        int tmp=a;
        a=b;
        b=tmp;
    }
    void HeapAdjust(vector<int>&arr,int root,int len){
        int tmp=arr[root];

        for(int j=2*root+1;j<len;j=2*j+1){
            if(j<len-1 && arr[j]<arr[j+1])
                ++j;
            if(tmp>arr[j])
                break;
            arr[root]=arr[j];
            root=j;
        }
        arr[root]=tmp;

    }
    vector<int> MySort(vector<int>& arr) {
        for(int i=arr.size()/2-1;i>=0;i--)
            HeapAdjust(arr,i,arr.size());

        for(int i=arr.size()-1;i>0;i--){
            Swap(arr[0],arr[i]);
            HeapAdjust(arr,0,i);
        }

        return arr;
    }
};