归并排序模板

147 阅读1分钟

1. 思想

2. 代码

#include<iostream>
using namespace std;

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

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

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++];
}