美文网首页
MergeSort 归并排序

MergeSort 归并排序

作者: leon4ever | 来源:发表于2018-01-01 20:51 被阅读12次

    ClassicalCode: mergeSort.cpp
    直接分析大佬简洁的源码。

    #include <vector>
    #include <iostream>
    using namespace std;
    
    void merge(vector<int>& nums, int lo, int mid, int hi){
        vector<int> B(nums.begin() + lo, nums.begin()  + mid);//注意此处对vector初始化,vector大小为mid-lo
        int i = 0, j = mid;//i为B内的指针位置
        int k = lo;  //k为nums内的指针位置
        while(i < B.size() && j < hi){      //区间左闭右开  j < hi
            if(B[i] < nums[j]) nums[k++] = B[i++];
            else nums[k++] = nums[j++];
        }
        while(i < B.size()) nums[k++] = B[i++];
        //else 后半部分还有,但是已经就地了,无需处理,省去了赋值的操作
        return;
    }
    
    
    void mergeSort(vector<int> &nums, int lo, int hi){
        if(hi < lo + 2) return;
        int mid = lo + ((hi - lo) >> 1);  //大佬的除法必须用位运算
        mergeSort(nums, lo, mid);
        mergeSort(nums, mid, hi);  //注意,这区间也是左闭右开
        merge(nums, lo, mid, hi);
    }
    
    
    int main(){
        vector<int> nums{16,4,10,14,7,9,3,2,8,1};
        mergeSort(nums, 0, nums.size());
    
        for(int i = 0; i < nums.size(); i++){
            cout << nums[i] << " ";
        }
        cout << endl;
    
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:MergeSort 归并排序

          本文链接:https://www.haomeiwen.com/subject/wfqxnxtx.html