实现方法一:
#include <iostream>
#include<cstdio>
#define maxn 10000
int 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 100000
int 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 100005
int 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 100005
int 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;
}