归并排序模板
有时候快排/归并之类并不简简单单只是排序,比如快排可以求第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; }