归并排序

来源:互联网 发布:南京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
原创粉丝点击