标签:style class blog c code java
归并排序
#define LOCAL #include<cstdio> #include <random>//生成随机数c++11支持 #include <ctime> #include <cstdlib> #include<algorithm> using namespace std; int const MAX_N=10; int a[MAX_N],b[MAX_N],c[2*MAX_N]; //归并排序,前提是a,b必须是有序的,a,b中的数都排序到c[]中 void MemeryArray(int a[],int n,int b[],int m,int c[]) { int i,j,k; i=j=k=0; // while(i<n&&j<m) { if(a[i]<b[j]) {//如果a[i]<b[j]则a[i]进入c[k],然后k++,i++ c[k++]=a[i++]; } else {//如果a[i]>=b[j]则a[i]进入c[k],然后k++,j++ c[k++]=b[j++]; } } //如果a,b中有一个数组空了,就只需把另一个数组直接复制到c中即可 while(i<n) { c[k++]=a[i++]; } while(j<m) { c[k++]=a[j++]; } } int main() { #ifdef LOCAL freopen("test.in","r",stdin); freopen("test.out","w",stdout); #endif std::random_device rd;//生成随机数 for(int i=0;i<MAX_N;i++) { a[i]=rd(); b[i]=rd(); } std::sort(a,a+MAX_N);//对a排序 std::sort(b,b+MAX_N);//对b排序 MemeryArray(a,MAX_N,b,MAX_N,c); for(int i=0;i<MAX_N*2;i++) { printf("%d\n",c[i]); } return 0; }
应用:
思想:归并排序的同时记住逆序数
#define LOCAL #include<cstdio> const int MAX_N=1000001; long long a[MAX_N],b[MAX_N]; long long count; void Merge(long long a[] ,int start,int mid,int end)//归并排序部分 { int i=start,j=mid+1,k=start; while(i<=mid&&j<=end) { if(a[i]<=a[j]) b[k++]=a[i++]; else { count+=j-k; b[k++]=a[j++]; } } while(i<=mid) { b[k++]=a[i++]; } while(j<=end) { b[k++]=a[j++]; } for(int i=start;i<=end;i++) { a[i]=b[i]; } } void MergeSort(long long a[],int start,int end)//归并排序 { if(start<end) { int mid=(start+end)/2; MergeSort(a,start,mid); MergeSort(a,mid+1,end); Merge(a,start,mid,end); } } int main() { #ifdef LOCAL freopen("117.in","r",stdin); freopen("117.out","w",stdout); #endif int n,m; scanf("%d",&n); while(n--) { scanf("%d",&m); count=0; for(int i=0;i<m;i++) { scanf("%d",&a[i]); } MergeSort(a,0,m-1); printf("%I64d\n",count); } return 0; }
标签:style class blog c code java
原文地址:http://www.cnblogs.com/jianfengyun/p/3736489.html