归并排序模板

有时候快排/归并之类并不简简单单只是排序,比如快排可以求第k大,归并在部分已排序的情况下效率较高不容易被卡~

#include <bits/stdc++.h>
using namespace std;
void merge(int a[], int l, int r, int mid)
{
    int aux[r-l+1],i,j,k;
    for(k=l;k<=r;k++)aux[k-l]=a[k];//因为aux 数组只开到r-l+1,所以必须偏移一下才能存的了 
    i=l,j=mid+1;//i为左半截数组的起始位置 j为右半截数组的起始位置 k为第三个指针
    for(k=l;k<=r;k++)
    {
        if(i>mid)//左半截已经用完了,剩下的全用右半截填充 
        {
            a[k]=aux[j-l];
            j++;
        }
        else if(j>r)//同上 
        {
            a[k]=aux[i-l];
            i++;
        }
        else if(aux[i-l]>aux[j-l])
        {
            a[k]=aux[j-l];
            j++;
        }
        else
        {
            a[k]=aux[i-l]; 
            i++;
        }
     } 
}
void merge_sort(int a[], int l,int r)
{
    if(l>=r)return;
    int mid=(l+r)/2;
    merge_sort(a,l,mid);
    merge_sort(a,mid+1,r); 
    merge(a,l,r,mid);
}
int main()
{
    int m[10]={0,4,3,1,8,7,9,6,5,2};
    merge_sort(m,0,9);
    int i; 
    for(i=0;i<=9;i++)cout<<m[i]<<' ';
    return 0;
}
原文地址:https://www.cnblogs.com/lipoicyclic/p/12594427.html