<排序>合并排序...

来源:互联网 发布:java对象存储数据库 编辑:程序博客网 时间:2024/06/06 10:00

据说ACM存在N种排序...现在的合并排序时间复杂度是O(nlogn)  呵呵,确实有时候的学习下...

简单型的...

#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <cmath>#include <algorithm>#define M 0x7fffffffusing namespace std;int main(){int a[100],b[100],c[100],n,m,i;while (~scanf("%d%d",&n,&m)){for (i=0;i<n;i++)scanf("%d",&a[i]);for (i=0;i<m;i++)scanf("%d",&b[i]);sort(a,a+n);sort(b,b+m);a[n]=M;b[m]=M;int l=n+m;int k1=0,k2=0;for (i=0;i<l;i++){if (a[k1]<=b[k2])c[i]=a[k1++];else c[i]=b[k2++];}for (i=0;i<l;i++)printf("%d ",c[i]);}return 0;}


 

函数型的...

#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <cmath>#include <algorithm>using namespace std;#define M 0x7fffffffint a[1000];void fff(int *a,int begin,int mid,int end){int i,j;int k1=mid-begin+1;int k2=end-mid;int L[k1+5];int R[k2+5];for (i=1;i<=k1;i++)L[i]=a[begin+i-1];for (i=1;i<=k2;i++)R[i]=a[mid+i];L[k1+1]=M;R[k2+1]=M;i=1;j=1;for (int k=begin;k<=end;k++){if (L[i]<=R[j])a[k]=L[i++];else a[k]=R[j++];}}void ff(int *a,int begin,int end){if (begin<end){int t=(begin+end)/2;ff(a,begin,t);ff(a,t+1,end);fff(a,begin,t,end);}}int main(){int n,i;while (~scanf("%d",&n)){for (i=0;i<n;i++)scanf("%d",&a[i]);ff(a,0,n-1);for (i=0;i<n;i++)printf("%d ",a[i]);printf("\n");}return 0;}

增加一条代码即可求出数列的逆序数...

#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <cmath>#include <algorithm>using namespace std;#define M 0x7fffffffint a[500010];__int64 ans;void fff(int *a,int begin,int mid,int end){int i,j;int k1=mid-begin+1;int k2=end-mid;int L[k1+5];int R[k2+5];for (i=1;i<=k1;i++)L[i]=a[begin+i-1];for (i=1;i<=k2;i++)R[i]=a[mid+i];L[k1+1]=M;R[k2+1]=M;i=1;j=1;for (int k=begin;k<=end;k++){if (L[i]<=R[j])a[k]=L[i++];else {a[k]=R[j++];ans+=k1-i+1;}}}void ff(int *a,int begin,int end){if (begin<end){int t=(begin+end)/2;ff(a,begin,t);ff(a,t+1,end);fff(a,begin,t,end);}}int main(){int n,i;while (~scanf("%d",&n) && n){for (i=0;i<n;i++)scanf("%d",&a[i]);ans=0;ff(a,0,n-1);printf("%I64d\n",ans);//for (i=0;i<n;i++)//printf("%d ",a[i]);//printf("\n");}return 0;}