统计数组中的逆序对的数量

原创 2015年07月07日 19:20:17
package java_study.JianZhiOffer;


import org.junit.Test;

/**
 * Created by ethan on 2015/7/7.
 * 剑指offer中No36,直接双重for循环的时间复杂度是O(n2),这样效率太低
 * 可以是用归并排序的思路进行排计算逆序对的数目,时间复杂度是O(nlogn)
 */
public class No36数组中的逆序对 {

    public int findReversePairNumbers(int[] arr){
        if (arr==null) return 0;
        if (arr.length==1 || arr.length==0) return 0;
        return mergeSort(arr, 0, arr.length-1, new int[arr.length]);
    }

    public int mergeSort(int[] arr, int start, int end, int[] tmp){
        if (start < end){
            int mid = (start+end)/2;
            int left = mergeSort(arr, start, mid, tmp);
            int right = mergeSort(arr, mid+1, end, tmp);
            int count = mergeTwoSortedArr(arr, start, mid, end, tmp);
            return count+left+right;
        }else {
            return 0;
        }
    }

    public int mergeTwoSortedArr(int[] arr, int start, int mid, int end, int[] tmp){
        int start_1 = start;
        int end_1 = mid;
        int start_2 = mid+1;
        int end_2 = end;
        int index = end;
        int ans = 0;
        while (start_1<=end_1 && start_2<=end_2){
            if (arr[end_1]<arr[end_2]){
                tmp[index--] = arr[end_2--];
            }else {
                tmp[index--] = arr[end_1--];
                ans += (end_2-start_2+1);
            }
        }
        while (start_1<=end_1){
            tmp[index--] = arr[end_1--];
        }
        while (start_2<=end_2){
            tmp[index--] = arr[end_2--];
        }
        for (int i=start; i<=end; i++){
            arr[i] = tmp[i];
        }
        return ans;
    }

    @Test
    public void test(){
        int[] arr = {7, 5, 6, 4};
        System.out.println(findReversePairNumbers(arr));
    }
}

相关文章推荐

统计数组中逆序对

  • 2014年06月05日 21:06
  • 1KB
  • 下载

数组中逆序对统计方法

首先阐述一下逆序对的概念。假设有一个数组为Array[0..n] 其中有元素a[i],a[j].如果 当ia[j],那么我们就称(a[i],a[j])为一个逆序对。     那么统计一个数组中的逆序...

积跬步至千里——算法强化训练(1)统计数组中的逆序对

1、最简单的方法是暴力,对于每一个数都依次和后面的进行比较。 #include #include using namespace std; int InverseParis(vector &d...

算法导论习题---求n个元素任何排列中逆序对的数量

问题描述:设A[1…n]是一个包含n个不同数的数组。如果在i < j的情况下,有A[i] > A[j],则(i,j)就称为A中的一个逆序对(inversion),(逆序对的元素是下标,而不是数组里的值...
  • will130
  • will130
  • 2015年06月16日 15:20
  • 1611

斜率小于0的连线数量,逆序对

1107 斜率小于0的连线数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 二维平面上N个点之间共有C(n,2)条连线。求这C(n,2)条线中斜率小于0的线的数...

OI模板·求逆序对数量

逆序对的概念与计算。

【算法】逆序对问题的四种解法(归并排序,BST,树状数组,线段树)及变形

引发我对逆序对这个问题思考的源自这道题:315. Count of Smaller Numbers After Self 以前我以为求一个序列逆序对个数的解法就是归并排序的改版...

历届试题 小朋友排队 树状数组求逆序对

问题描述   n 个小朋友站成一排。现在要把他们按身高从低到高的顺序排列,但是每次只能交换位置相邻的两个小朋友。   每个小朋友都有一个不高兴的程度。开始的时候,所有小朋友的不高兴程度都是...

树状数组应用之——求逆序对

这里说的很好,把求逆序的步骤说的很明白,我也是看完才懂的,之前自己想了很久就是不明白为什么可以用树状数组求逆序    转载: 树状数组,具体的说是 离散化+树状数组。这也是学习树状数组的第一题....
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:统计数组中的逆序对的数量
举报原因:
原因补充:

(最多只允许输入30个字)