首页 > 代码库 > 归并排序
归并排序
归并排序
#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; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。