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

 public class Inversions {

     public static int inversions(int [] A,int p, int r)
     {   

         if(p<r)
         {
             int q = (int) Math.floor( (p+r)/2 );
             int left = inversions(A,p,q);
             int right = inversions(A,q+1,r);
             int c = combine(A,p,q,r);
             return left + right + c;
         }
         return 0;

     }
     public static int combine(int [] A, int p, int q, int r)
     {
         int total_inversions = 0;

         int n1 = q-p+1;
         int n2 = r-q;
         int [] L = new int[n1];
         int [] R = new int[n2];
         for(int i=0; i<n1; i++)
           L[i] = A[p+i];
         for(int i=0; i<n2;i++)
             R[i]=A[q+i+1];

         int i=0;
         int j=0;
         int counter = p;
         while(i<L.length && j<R.length)
         {
             if(L[i]<=R[j])
             {
                 A[counter]=L[i];
                 i++;
             }
             else
             {
                 A[counter]=R[j];
                 j++;
                 total_inversions += (q-(p+i)+1);
             }
             counter++;
         }
         if(i==L.length)
         {
             for(int k=j;k<R.length;k++)
                 A[counter++] = R[k];
         }
         else
         {
             for(int k=i;k<L.length;k++)
                 A[counter++] = L[k];
         }
         return total_inversions;
     }
     public static void main(String[] args) {
         int A[] = {2,3,8,6,1,7,9,1};
         int num_of_inversions = inversions(A,0,A.length-1);
         System.out.println(num_of_inversions);
     }
 }

《算法导论》Problem 2-4 Inversions的更多相关文章

  1. 算法导论----VLSI芯片测试; n个手机中过半是好的,找出哪些是好手机

    对于分治(Divide and Conquer)的题目,最重要是 1.如何将原问题分解为若干个子问题, 2.子问题中是所有的都需要求解,还是选择一部分子问题即可. 还有一点其实非常关键,但是往往会被忽 ...

  2. 2.1 insertion sort 《算法导论》答案

    2.1 insertion sort <算法导论>答案 答案索引帖 2.1-1 Using Figure 2.2 as a model, illustrate the operation ...

  3. [Algorithm] 如何正确撸<算法导论>CLRS

    其实算法本身不难,第一遍可以只看伪代码和算法思路.如果想进一步理解的话,第三章那些标记法是非常重要的,就算要花费大量时间才能理解,也不要马马虎虎略过.因为以后的每一章,讲完算法就是这样的分析,精通的话 ...

  4. B树——算法导论(25)

    B树 1. 简介 在之前我们学习了红黑树,今天再学习一种树--B树.它与红黑树有许多类似的地方,比如都是平衡搜索树,但它们在功能和结构上却有较大的差别. 从功能上看,B树是为磁盘或其他存储设备设计的, ...

  5. 红黑树——算法导论(15)

    1. 什么是红黑树 (1) 简介     上一篇我们介绍了基本动态集合操作时间复杂度均为O(h)的二叉搜索树.但遗憾的是,只有当二叉搜索树高度较低时,这些集合操作才会较快:即当树的高度较高(甚至一种极 ...

  6. 基本数据结构(2)——算法导论(12)

    1. 引言     这一篇博文主要介绍链表(linked list),指针和对象的实现,以及有根树的表示. 2. 链表(linked list) (1) 链表介绍      我们在上一篇中提过,栈与队 ...

  7. 堆排序与优先队列——算法导论(7)

    1. 预备知识 (1) 基本概念     如图,(二叉)堆是一个数组,它可以被看成一个近似的完全二叉树.树中的每一个结点对应数组中的一个元素.除了最底层外,该树是完全充满的,而且从左向右填充.堆的数组 ...

  8. quickSort算法导论版实现

    本文主要实践一下算法导论上的快排算法,活动活动. 伪代码图来源于 http://www.cnblogs.com/dongkuo/p/4827281.html // imp the quicksort ...

  9. [算法导论]二叉查找树的实现 @ Python

    <算法导论>第三版的BST(二叉查找树)的实现: class Tree: def __init__(self): self.root = None # Definition for a b ...

  10. 算法导论第十八章 B树

    一.高级数据结构 本章以后到第21章(并查集)隶属于高级数据结构的内容.前面还留了两章:贪心算法和摊还分析,打算后面再来补充.之前的章节讨论的支持动态数据集上的操作,如查找.插入.删除等都是基于简单的 ...

随机推荐

  1. win8.1去掉鼠标右键回收站固定到开始菜单的方法

    win8.1去掉鼠标右键“回收站固定到开始菜单” 平台:win8.1 问题: 桌面“回收站”右键菜单里有个“固定到开始屏幕”,一不小心就误按,设法删之. 打开注册表编辑器.在注册表编辑器里面定位到:H ...

  2. nagios总结

    主要功能 网络服务监控(SMTP.POP3.HTTP.NNTP.ICMP.SNMP.FTP.SSH) 主机资源监控(CPU load.disk usage.system logs),也包括Window ...

  3. Vector2.Angle 的 bug

    获取角度 ,官方提供了 Vector2.Angle 来得值,他的值是在 0  ,180之间 原始代码是 public static float Angle(Vector3 from, Vector3 ...

  4. js框架——angular.js(6)

    1. ng-class 这个指令是用来绑定一个或者多个css代码.它的值一般是一个表达式,也可以是函数什么的,只要返回的确实是一个类的名字就可以—— ng-class="nextPageDi ...

  5. jquery_api事件(二)

    1.hover 一个模仿悬停事件的方法.它为频繁使用的任务提供了一种“保持在其中”的状态. 当鼠标移动到一个匹配的元素上面时,会触发指定的第一个函数.当鼠标移出这个元素时,会触发指定的第二个函数.而且 ...

  6. 3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛

    3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 243  Solved: 167[S ...

  7. Disassembly2:Built-in Type

    先贴一段代码: 跟踪后看到:

  8. 正确使用String,StringBuffer,StringBuilder

    很多时候在实际中,我们很常用的就是字符串String. 对于它,网上已经说的很多了. 我就说一点是特别重要的需要记住的,String赋值之后它就是不能被改变的. 也就是这一点,导致了String在操作 ...

  9. centos和ubuntu下使用cron设置定时任务

    1.启动cron工具[ps:使用root权限] centos启动cron两种方式 a) /etc/init.d/crond start b) service crond start ubuntu启动c ...

  10. C++异常机制的实现方式和开销分析

    C++异常机制的实现方式和开销分析 白杨 http://baiy.cn http://baiy.cn/doc/cpp/inside_exception.htm 在我几年前开始写<C++编码规范与 ...