归并排序
来源:互联网 发布:南京seo公司优化 编辑:程序博客网 时间:2024/06/16 03:07
实现方法一:
#include <iostream>#include<cstdio>#define maxn 10000int aa[maxn];using namespace std;int n;void Merge(int *A,int *B,int s,int m,int n){ int j,k; for(k=s,j=m+1; s<=m&&j<=n; k++) { if(A[s]<=A[j]) B[k]=A[s++]; else B[k]=A[j++]; } while(s<=m) B[k++]=A[s++]; while(j<=n) B[k++]=A[j++];}void Msort(int *A,int *B,int s,int t){ int m; int pt2[n+1]; if(s==t) B[s]=A[t]; else { m=(s+t)/2; Msort(A,pt2,s,m); Msort(A,pt2,m+1,t); Merge(pt2,B,s,m,t); }}void Mergesort(int *P,int n){ Msort(P,P,1,n);}int main(){ while(scanf("%d",&n)==1) { for(int i=1;i<=n;i++) scanf("%d",&aa[i]); Mergesort(aa,n); for(int i=1;i<=n;i++) printf("%d ",aa[i]); printf("\n"); } return 0;}
实现方法二:
#include <iostream>#include<cstdio>using namespace std;#define maxn 100000int aa[maxn],T[maxn];int n;void merge_sort(int *A,int x,int y,int *T){ ///至少有两个元素 if(y-x>1) { int m=x+(y-x)/2; int p=x,q=m,i=x; merge_sort(A,x,m,T); merge_sort(A,m,y,T); while(p<m||q<y) { if(q>=y||(p<m&&A[p]<=A[q])) T[i++]=A[p++]; else T[i++]=A[q++]; } ///这一步不能全部放在if外面执行,因为此处的数组A中发生的变化会影响到后续的操作 for(int i=x; i<y; i ++) A[i]=T[i]; }}int main(){ while(scanf("%d",&n)==1) { for(int i=1; i<=n; i++) scanf("%d",&aa[i]); merge_sort(aa,1,n+1,T); for(int i=1; i<=n; i++) printf("%d ",aa[i]); printf("\n"); } return 0;}
应用:逆序对
题目链接:
http://ac.jobdu.com/problem.php?pid=1348
代码1:
注意结果数据的范围:long long!!!
#include <iostream>#include<cstdio>using namespace std;#define maxn 100005int aa[maxn],T[maxn];int n;long long cnt;void merge_sort(int *A,int x,int y,int *T){ ///至少有两个元素 if(y-x>1) { int m=x+(y-x)/2; int p=x,q=m,i=x; merge_sort(A,x,m,T); merge_sort(A,m,y,T); while(p<m||q<y) { if(q>=y||(p<m&&A[p]<=A[q])) T[i++]=A[p++]; else { T[i++]=A[q++]; cnt+=m-p; } } ///这一步不能全部放在if外面执行,因为此处的数组A中发生的变化会影响到后续的操作 for(int i=x; i<y; i ++) A[i]=T[i]; }}int main(){ while(scanf("%d",&n)==1) { for(int i=1; i<=n; i++) scanf("%d",&aa[i]); cnt=0; merge_sort(aa,1,n+1,T); // for(int i=1; i<=n; i++) // printf("%d ",aa[i]); cout<<cnt<<endl; } return 0;}
代码2:
#include <iostream>#include<cstdio>#define maxn 100005int aa[maxn];using namespace std;int n;long long cnt;void Merge(int *A,int *B,int s,int m,int n){ int j,k; for(k=s,j=m+1; s<=m&&j<=n; k++) { if(A[s]<=A[j]) B[k]=A[s++]; else { B[k]=A[j++]; cnt+=m-s+1; } } while(s<=m) B[k++]=A[s++]; while(j<=n) B[k++]=A[j++];}void Msort(int *A,int *B,int s,int t){ int m; int pt2[n+1]; if(s==t) B[s]=A[t]; else { m=(s+t)/2; Msort(A,pt2,s,m); Msort(A,pt2,m+1,t); Merge(pt2,B,s,m,t); }}void Mergesort(int *P,int n){ Msort(P,P,1,n);}int main(){ while(scanf("%d",&n)==1) { for(int i=1; i<=n; i++) scanf("%d",&aa[i]); cnt=0; Mergesort(aa,n); // for(int i=1; i<=n; i++) // printf("%d ",aa[i]); cout<<cnt<<endl; } return 0;}
0 0