来源:剑指offer

逆序对定义:a[i]>a[j],其中i<j

思路:利用归并排序的思想,先求前面一半数组的逆序数,再求后面一半数组的逆序数,然后求前面一半数组比后面一半数组中大的数的个数(也就是逆序数),这三个过程加起来就是整体的逆序数目了。

易错点:第二个方法在归并时,需要array的左右子数组是已排好序的数组,归并的结果是得到排好序的数组copy。因此在递归调用iPairs时,方法的前2个参数是颠倒的,这样得到的array才是排好序的。

比如第一次时用copy当辅助数组对array排序,第二次就正好反过来。

代码:

package algorithm;

public class InversePairs {

    public static int iPairs(int[] array) {
if (array == null)
throw new IllegalArgumentException();
// 创建辅助数组
int length = array.length;
int[] copy = new int[length];
System.arraycopy(array, 0, copy, 0, length);
int numberOfInversePairs = iPairs(array, copy, 0, length - 1);
return numberOfInversePairs;
} /**
* @author Thanos
* @param array 未归并数组
* @param copy 用于存储归并后数据的数组
* @param begin 起始位置
* @param end 结束位置
* @return 逆序数
*/
public static int iPairs(int[] array, int[] copy, int begin, int end) {
if(begin == end)
return 0;
int mid = (begin + end) / 2;
// 递归调用
int left = iPairs(copy, array, begin, mid);
int right = iPairs(copy, array, mid + 1, end);
// 归并
int i = mid, j = end, pos = end;
int count = 0; // 记录相邻子数组间逆序数 while(i >= begin && j >= mid + 1)
{
if(array[i] > array[j]) {
copy[pos--] = array[i--];
count += j - mid;
} else
copy[pos--] = array[j--];
} while(i >= begin)
copy[pos--] = array[i--];
while(j >= mid + 1)
copy[pos--] = array[j--]; return left + right + count;
} public static void main(String... args) {
int test[] = { 7, 5, 1, 6, 4 };
int count = iPairs(test);
System.out.println(count + " ");
} }

数组中的逆序对(Java实现)的更多相关文章

  1. 【Java】 剑指offer(51)数组中的逆序对

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成 ...

  2. 剑指Offer-34.数组中的逆序对(C++/Java)

    题目: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%10000 ...

  3. 【剑指Offer】35、数组中的逆序对

      题目描述:   在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P ...

  4. 【Offer】[51] 【数组中的逆序对】

    题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数.例如,在数组 ...

  5. 剑指 Offer 51. 数组中的逆序对 + 归并排序 + 树状数组

    剑指 Offer 51. 数组中的逆序对 Offer_51 题目描述 方法一:暴力法(双层循环,超时) package com.walegarrett.offer; /** * @Author Wal ...

  6. [剑指OFFER] 数组中的逆序对

    题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数.     分析:利用归并排序的思想,分成2部分,每一部分按照从大到 ...

  7. (剑指Offer)面试题36:数组中的逆序对

    题目: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 思路: 1.顺序扫描 顺序扫描整个数组,每扫描到一个数字,就将该数 ...

  8. 九度OJ 1348 数组中的逆序对 -- 归并排序

    题目地址:http://ac.jobdu.com/problem.php?pid=1348 题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求 ...

  9. [jobdu]数组中的逆序对

    http://ac.jobdu.com/problem.php?pid=1348 数组中的逆序对也是个常见的题目,算法导论中也有一些描述,参考:http://www.cnblogs.com/wuyue ...

随机推荐

  1. maven 下载镜像文件卡,下载pom文件慢的问题

    问题原因: maven默认的镜像库URL为 http://maven.net.cn/content/groups/public/ 由于网络原因,可能导致响应速度超级慢,或者无法效应: 解决方法: 配置 ...

  2. WebMvcConfigurer

    [传送门]:详解WebMvcConfigurer接口 1. 设置跨域规则 @Configuration public class CrossOriginConfig implements WebMvc ...

  3. JS闭包与JS函数

    先说说在网上看到的一个闭包案例: var add = (function () {var counter = 0;return function () {return counter += 1;}}) ...

  4. iOS app 支持HTTPS iOS开发者相关

    2016年12月21日更新开发者中心链接https://developer.apple.com/news/?id=12212016b该链接是苹果昨天刚在官网给的正式回复 如下: App Transpo ...

  5. 用synchronized同时修饰父类和子类,线程是安全的。即对象锁可重入

    public class SyncDubbo { static class Main { public int i = 10; public synchronized void operationSu ...

  6. RecyclerView的简单使用

    使用 RecyclerView 要做下面这些操作, 1.在build.gradle添加 RecyclerView的依赖,因为RecyclerView不是内置在android系统中的,请注意版本要一致 ...

  7. Ubuntu中root的默认密码

    原文地址:http://www.cnblogs.com/xuyingying/archive/2008/10/16/1312584.html 安装完Ubuntu后忽然意识到没有设 置root密码,不知 ...

  8. 如何在线显示php源代码

    通过php提供的函数highlight_file和highlight_string实现

  9. Scala函数与函数式编程

    函数是scala的重要组成部分, 本文将探讨scala中函数的应用. scala作为支持函数式编程的语言, scala可以将函数作为对象即所谓"函数是一等公民". 函数定义 sca ...

  10. [Noip2015PJ] 求和

    Description 一条狭长的纸带被均匀划分出了 \(n\) 个格子,格子编号从 \(1\) 到 \(n\) .每个格子上都染了一种颜色 \(color_i\) 用 \([1,m]\) 当中的一个 ...