归并排序与逆序对

归并排序与逆序对
#include < stdio.h >
void  msort( long   * a, long   * t, long  begin, long  end)
{
    
long  mid = (begin + end) / 2 ,p = begin,q = mid + 1 ,i = begin;
    
if (begin < end)
    {
       msort(a,t,begin,mid);
       msort(a,t,mid
+ 1 ,end);
       
while (i <= end)
       {
          
if (q > end || a[p] <= a[q]) t[i ++ ] = a[p ++ ];
          
else  t[i ++ ] = a[q ++ ];
       }
       
for ( long  i = begin;i <= end;i ++ ) a[i] = t[i];
    }
}
int  main()
{
    
// *
    freopen( " data.in " , " r " ,stdin);
    freopen(
" data.out " , " w " ,stdout);
    
// */
     const   long  maxn = 108 ;
    
long  n = 0 ,a[maxn],t[maxn];
    
bool  first = true ;
    
while (scanf( " %ld " , & a[n + 1 ]) == 1 ) n ++ ;
    
//   Read In
    msort(a,t, 1 ,n);
    
//   M_sort
     for ( long  i = 1 ;i <= n;i ++ )
    {
       
if (first) first = false ;
       
else  printf( "   " );
       printf(
" %ld " ,a[i]);
    }
    putchar(
' \n ' );
return   0 ;
}
在上面的归并排序程序的基础上,很容易修改得出求一个序列逆序对个数的程序。
以下是我的代码,只给出函数,main()与上面的基本相同:
long  count( long   * a, long   * t, long  begin, long  end)
{
    
long  mid = (begin + end) / 2 ,p = begin,q = mid + 1 ,i = begin,re = 0 ;
    
if (begin < end)
    {
       re
+= count(a,t,begin,mid);
       re
+= count(a,t,mid + 1 ,end);
       
while (i <= end)
       {
          
if (q > end || a[p] <= a[q]) t[i ++ ] = a[p ++ ];
          
else
          {
             t[i
++ ] = a[q ++ ];
             re
+= mid - p + 1 ;
          }
       }
       
for ( long  i = begin;i <= end;i ++ ) a[i] = t[i];
    }
    
return  re;
}

你可能感兴趣的:(归并排序与逆序对)