X周

导航

求逆序数算法

 1 #include<iostream>
 2 #include<cstdlib>
 3 #include<climits>
 4 using namespace std;
 5 
 6 
 7  int Inversion(int a[],int start,int mid,int end){
 8      
 9      int PairNum = 0;
10      
11      for(int i=start;i<=mid;++i){
12          
13          for(int j=mid+1;j<=end;++j){
14          
15              if(a[i]>a[j])
16                  ++PairNum;
17          } 
18      }
19  
20      return PairNum;
21  }
22  int Inversion1(int a[],int low,int mid,int high){
23       int sub1_len=mid-low+1;                      
24      int sub2_len=high-mid;
25      int PairNum = 0;                      
26      int *L=NULL,*R=NULL;
27      L = (int *)malloc(sizeof(int)*(sub1_len));
28      R = (int *)malloc(sizeof(int)*(sub2_len)); 
29      for(int i=0;i<=sub1_len-1;++i){                
30          L[i]=a[low+i];                          
31      }
32      for(int j=0;j<=sub2_len-1;++j){
33          R[j]=a[mid+1+j];                       
34      } 
35       int i= 0; 
36      int j =0;
37       int k= low;
38       while(i<sub1_len&&j<sub2_len){                //注意这里的循环条件,不是k<=high!!! 
39           if(L[i]<=R[j])
40           a[k++] = L[i++];
41         else {
42           a[k++] = R[j++];
43           PairNum += sub1_len-i;                //当R数组元素r较小时 L中剩的元素个数是L中大于r的元素的个数, 累加起来即为有序的俩个子数组间的逆序数
44         }
45            
46         
47       }
48       while(i<sub1_len)
49          a[k++]= L[i++];
50       while(j<sub2_len)
51          a[k++]= R[j++];
52       return PairNum;
53  }
54  
55  int InversionPair(int a[],int start, int end){
56      
57      int mid = 0;
58      int p,q,r;
59      if(start<end){
60          
61          mid = (start+end)/2; 
62          return InversionPair(a,start,mid)+InversionPair(a,mid+1,end)+Inversion1(a,start,mid,end);;
63      }
64      else
65          return 0;
66  }
67  
68  
69 
70 int main(){
71  
72       int num;
73       int InversionPairNum; 
74       while(1){    
75           cin>>num;
76           InversionPairNum=0; 
77           int *array=NULL;
78           array = (int *)malloc(sizeof(int)*(num));
79           for(int i=0;i<num;i++)    cin>>array[i];
80           InversionPairNum = InversionPair(array,0,num-1);
81           
82           cout<<InversionPairNum<<endl;     
83       }
84  
85      return 0;
86  }

 

posted on 2013-06-24 21:16  X周  阅读(621)  评论(0)    收藏  举报