归并排序

归并排序的步骤如下:

思想:将数组分成两部分,两部分都是有序的时候,把两个数组合并。合并的方法就是双指针,i 指向左边的数组,j 指向右边的数组,比较 L[i] 和 R[j] 的大小,将其填入原数组,并且将 i 或 j 往后移。

步骤:

1.将数组分成两部分,直到其中只包含一个元素

2.当数组只包含一个元素的时候,递归返回上一层,此时数组包含两个元素,左数组一个,右数组一个,将左右数组合并。

 

#include <iostream>
#include <vector>
using namespace std;

void merge(vector<int>& arr, int l, int m, int r){
    int n1 = m-l+1;
    int n2 = r-m;

    vector<int> L;
    vector<int> R;

    for(int i = 0; i < n1; i++) L.push_back(arr[l+i]);

    for(int j = 0; j < n2; j++) R.push_back(arr[m+1+j]);

    int i = 0;
    int j = 0;
    int k = l;
    while(i < n1 && j < n2){
        if(L[i] <= R[j]) arr[k++] = L[i++];
        else arr[k++] = R[j++];
    }

    while(i < n1) arr[k++] = L[i++];
    while(j < n2) arr[k++] = R[j++];
}

void mergeSort(vector<int>& arr, int l, int r){
    if(l < r){
        int m = l+(r-l)/2;
        mergeSort(arr, l, m);
        mergeSort(arr, m+1, r);

        merge(arr, l, m, r);
    }
}

int main(){
    vector<int> arr = {38};
    mergeSort(arr, 0, arr.size()-1);
    return 0;
}

 

posted @ 2020-04-24 19:38  jenningszheng  阅读(182)  评论(0编辑  收藏  举报