1. 思想

image.png

2. 代码

#include<iostream>
using namespace std;

const int N = 1e6+10;
int m[N], tmp[N];
int n;

void merge_sort(int m[], int l, int r){
    if(l >= r)
        return;
    
    //取分界点
    int mid = l+r >> 1;
    
    //递归排序左右两段
    merge_sort(m, l, mid);
    merge_sort(m, mid+1, r);
    
    //合二为一,即归并
    int k=0, i=l, j=mid+1;
    while(i<=mid && j<=r){
        if(m[i]<=m[j])
            tmp[k++] = m[i++];
        else
            tmp[k++] = m[j++];
    }
    while(i <= mid)
        tmp[k++] = m[i++];
    while(j <= r)
        tmp[k++] = m[j++];
    for(int i=l, j=0; i<=r;)
        m[i++] = tmp[j++]; 
}

int main(){
    cin >> n;
    for(int i=0; i<n; i++)
        cin >> m[i];
    merge_sort(m, 0, n-1);
    for(int i=0; i<n; i++)
        cout << m[i] << ' ';
    return 0;
}

3. 调试

image.png

4. 模板

int tmp[100010];

void merge_sort(int m[], int l, int r){
    if(l>=r)
        return;
    int mid = (l+r)/2;
    
    merge_sort(m, l, mid), merge_sort(m, mid+1, r);
    
    int k=0, i=l, j=mid+1;
    while(i<=mid && j<=r){
        if(m[i] < m[j])
            tmp[k++] = m[i++];
        else
            tmp[k++] = m[j++];
    }
    while(i<=mid)
        tmp[k ++] = m[i ++];
    while(j<=r)
        tmp[k ++] = m[j ++];
    for(int i=l, j=0; i<=r;)
        m[i++] = tmp[j++];
}

saberMaster1995
1 声望0 粉丝

« 上一篇
快速排序模板