| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:归并排序 逆序数 第2 版In Reply To:归并排序 逆序数 第2 版 Posted by:ecjtubaowp at 2007-02-27 16:51:28 > //归并排序 2
> int a[1000002],b[1000002];
> __int64 num;
> void merge(int *a,int p,int q,int r)
> {int i,j=p;
> int startA=p,endA=q-1,startB=q,endB=r;
> while(startA<=endA&&startB<=endB)
> {
> if(a[startA]<=a[startB]){b[j]=a[startA];j++;startA++;}
> else
> {//1 9 10 4 5 12
> // startA q
> b[j]=a[startB];j++;startB++;
> num+=q-startA;//逆序数
> }
> }
> while(startA<=endA){b[j]=a[startA];startA++;j++;}
> while(startB<=endB){b[j]=a[startB];startB++;j++;}
> for(i=p;i<=r;i++)a[i]=b[i];
> }
> void msort(int *a,int n)
> {//a[0],...a[n-1]
> int n0,seg,lastseg,s0,i,j,m;
> n0=n;seg=1;lastseg=1;
> //开始有n段,每段长 seg=1,最后1段长lastseg=1
> num=0;
> while(n0>=2)
> {// 2 1 9 3 7 8 10 9 4 5 6 m=11 seg=1 lastseg=1
> // 1 2 3 9 7 8 9 10 4 5 6 n0=5 seg0=2 lastseg=3
> m=n0;//两段合为1段 m段合为n0=m/2段
> n0/=2;s0=seg*2;
> if(m%2==0)
> { //有 n0 seg 每seg 长s0
> for(i=1,j=0;i<=n0;i++,j+=s0)
> { if(i<n0)merge(a,j,j+seg,j+s0-1);
> else merge(a,j,j+seg,n-1);
> }
> lastseg=seg+lastseg;
> seg=s0;
> }
> else
> {// 1 2 3 4 5 6 7
> for(i=1,j=0;i<=n0;i++,j+=s0)
> merge(a,j,j+seg,j+s0-1);
> j=n-lastseg-s0;
> merge(a,j,n-lastseg,n-1);
> seg=s0;lastseg+=s0;
> }
> }
> }
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator