Chinaunix首页 | 论坛 | 博客
  • 博客访问: 458594
  • 博文数量: 118
  • 博客积分: 4015
  • 博客等级: 上校
  • 技术积分: 1233
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-24 22:11
文章分类

全部博文(118)

文章存档

2013年(5)

2011年(61)

2010年(52)

分类: C/C++

2011-12-07 16:11:25


The Program Demos how to Count the Inersion with Divide and Conquer Method
  1 #include
  2 using namespace std;
  3 int CountInversion(int *p, int l, int h);
  4 int Combine(int *p, int l,int m,int h);
  5 int main(){
  6   int A[6] = {112,66,4,6,3, 9};
  7   cout<  8   cout<  9   return 1;
 10 }
 11 int CountInversion(int *p, int l, int h){
 12   int M = (l + h) / 2;
 13   if(M == l){
 14     return Combine(p,l,M,h);
 15   }
 16   int CL, CH;
 17   CL = CountInversion(p,l,M);
 18   CH = CountInversion(p,M + 1,h);
 19   int CM = Combine(p,l,M,h);
 20   return CL + CH + CM;
 21 }
 22
 23 int Combine(int *p, int l,int m,int h){
 24   int l1 = m - l + 1 ;
 25   int l2 = h - m ;
 26   int INF = 65535;
 27   int *AL = new int[l1 + 1];
 28   int *AR = new int[l2 + 1];
 29   for(int i = 0; i < l1; i ++){
 30     AL[i] = p[l + i];
 31   }
 32   AL[l1] = INF;
 33   for(int j = 0; j < l2; j ++){
 34     AR[j] = p[m + j + 1];
 35   }
 36   AR[l2] = INF;
 37   int t1 = 0;
 38   int t2 = 0;
 39   for(int i = l; i <= h; i++){
 40     if(AL[t1] < AR[t2]){
 41       p[i] = AL[t1];
 42       t1 ++;
 43     }else{
 44       p[i] = AR[t2];
 45       t2 ++;
 46     }
 47   }
 48   t1 = t2 = 0;
 49   int Sum = 0;
 50   for( t1 = 0; t1 < l1; t1 ++){
 51     while(AL[t1] > 3 * AR[t2]){
 52       t2 ++;
 53     }
 54     Sum += t2;
 55   }
 56   return Sum;
 57 }

阅读(1885) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

neobilly2011-12-07 16:17:13

The difference of 2 sequence can be measured by the Inversions,
This program shows how to count the Inversions .