归并排序详解百度一大把,记录一下代码,是cdq分治的基础。
#include<stdio.h> #include<iostream> #include<algorithm> #include<cstring> #include<math.h> #include<string> #include<map> #include<queue> #include<stack> #include<set> #include<ctime> #define ll long long #define inf 0x3f3f3f3f const double pi=3.1415926; using namespace std; const int maxx=10086; int a[maxx];///用来排序的数组 int b[maxx];///原数组 int n; //归并排序 void merge_sort(int l,int r,int x[])///x数组作为参数,传入 { if(l==r) return; int mid=(l+r)/2;///取中点 merge_sort(l,mid,x); merge_sort(mid+1,r,x); int t1=l,t2=mid+1; for(int i=l;i<=r;i++) { if( (x[t1]<x[t2] && t1<=mid) || t2>r ) ///(当前左子区间的值比较小 并且 左指针还没有超出左边的最大值) 或者 右边已经排完了 就取左边 a[i]=x[t1++]; else ///不取左就取右 个数则由for循环保证 a[i]=x[t2++]; } for(int i=l;i<=r;i++)///对b数组也进行交换 x[i]=a[i]; } int main()///merge_sort { scanf("%d",&n); for(int i=0;i<=n;i++) b[i]=rand(); for(int i=0;i<=n;i++) printf("%d ",b[i]); merge_sort(0,n,b); for(int i=0;i<=n;i++) printf("%d ",b[i]); return 0; }