《算法导论》Problem 2-4 Inversions

在Merge Sort的基础上改改就好了。

 1 public class Inversions {
 2     
 3     public static int inversions(int [] A,int p, int r)
 4     {   
 5         
 6         if(p<r)
 7         {
 8             int q = (int) Math.floor( (p+r)/2 );
 9             int left = inversions(A,p,q);
10             int right = inversions(A,q+1,r);
11             int c = combine(A,p,q,r);
12             return left + right + c;
13         }
14         return 0;
15 
16     }
17     public static int combine(int [] A, int p, int q, int r)
18     {
19         int total_inversions = 0;
20         
21         int n1 = q-p+1;
22         int n2 = r-q;
23         int [] L = new int[n1];
24         int [] R = new int[n2];
25         for(int i=0; i<n1; i++)
26           L[i] = A[p+i];
27         for(int i=0; i<n2;i++)
28             R[i]=A[q+i+1];
29         
30         int i=0;
31         int j=0;
32         int counter = p;
33         while(i<L.length && j<R.length)
34         {
35             if(L[i]<=R[j])
36             {
37                 A[counter]=L[i];
38                 i++;
39             }
40             else
41             {
42                 A[counter]=R[j];
43                 j++;
44                 total_inversions += (q-(p+i)+1);
45             }
46             counter++;
47         }
48         if(i==L.length)
49         {
50             for(int k=j;k<R.length;k++)
51                 A[counter++] = R[k];
52         }
53         else
54         {
55             for(int k=i;k<L.length;k++)
56                 A[counter++] = L[k];
57         }
58         return total_inversions;
59     }
60     public static void main(String[] args) {
61         int A[] = {2,3,8,6,1,7,9,1};
62         int num_of_inversions = inversions(A,0,A.length-1);
63         System.out.println(num_of_inversions);
64     }
65 }

 

转载于:https://www.cnblogs.com/wzm-xu/p/4262899.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值