快排(必备)+归并(体会分治)+堆(自己建堆)

排序

http://www.nowcoder.com/questionTerminal/2baf799ea0594abd974d37139de27896

//快速排序 关键在于 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;
    }
};
全部评论

相关推荐

ProMonkey2024:5个oc?厉害! 但是有一个小问题:谁问你了?😡我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了(别的帖子偷来的,现学现卖😋)
点赞 评论 收藏
分享
10-30 23:23
已编辑
中山大学 Web前端
去B座二楼砸水泥地:这无论是个人素质还是专业素质都👇拉满了吧
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务