`

求逆序对的个数

J# 
阅读更多
其实就是二路归并排序,排序的同时记录交换次数就行了。
public class ReversalCount {
    private int[] array = null;
    private int[] tempArray = null;
    public ReversalCount(int[] array) {
        this.array = array;
        tempArray = new int[array.length];
    }
    public int calc() {
        return calc(0, array.length - 1);
    }
    private int calc(int l, int r) {
        if (l >= r) { // less than two numbers
            return 0;
        } else if (l + 1 == r) { // two numbers
            return (array[l] <= array[r]) ? 0 : swap(l, r);
        } else { // three or more numbers
            int m = (l + r) / 2;
            return calc(l, m) + calc(m + 1, r) + combine(l, m, r);
        }
    }
    private int combine(int l, int m, int r) {
        for (int idx = l; idx <= r; idx++) {
            tempArray[idx] = array[idx];
        }
        int count = 0, idx = l, lidx, ridx;
        for (lidx = l, ridx = m + 1; lidx <= m && ridx <= r; ) {
            if (tempArray[lidx] > tempArray[ridx]) {
                array[idx++] = tempArray[ridx++];
                count += m - lidx + 1;
            } else {
                array[idx++] = tempArray[lidx++];
            }
        }
        for (; ridx <= r; ++ridx) {
            array[idx++] = tempArray[ridx];
        }
        for (; lidx <= m; ++lidx) {
            array[idx++] = tempArray[lidx];
        }
        return count;
    }
    private int swap(int i, int j) {
        int temp = array;
        array = array[j];
        array[j] = temp;
        return 1;
    }
}
时间复杂度: T(n) = 2 T(n/2) + O(n) --> T(n) = O(n log n)
空间复杂度: S(n) = O(n)
分享到:
评论
2 楼 yiminghe 2008-10-29  
恩,不错,我也喜欢这种题
1 楼 yiminghe 2008-10-29  
恩,不错,我也喜欢这种题

相关推荐

    算法-求逆序对(信息学奥赛一本通-T1311).rar

    对于求逆序对的问题,我们可以维护一个数组C,其中C[i]表示在数组A中,所有小于等于i的元素的个数。当数组A发生变化时,我们通过树状数组更新C[i]。 - 初始化C数组,C[i] = 0,然后遍历数组A,对每个元素A[i],在...

    归并求逆序对 分治 递归

    因此,逆序对数量增加 `L` 中剩余元素的个数,即 `mid - i + 1`。 #### 示例代码分析 下面对示例代码进行逐行解释: ```c #include #include ints=0; // 定义全局变量 s 来记录逆序对的数量 ``` ```c voidsort(int...

    算法分析 统计逆序对

    (1)它的左半部分逆序对的个数,(2)加上右半部分逆序对的个数,(3)再加上左半部分元素大于右半部分元素的数量。 其中前两部分(1)和(2)由递归来实现。要保证算法最后效率O(nlogn),第三部分(3)应该如何...

    逆序对问题

    (2)插入排序的运行时间和数组中逆序对的个数有关系吗?什么关系? 输入格式 第一行:n,表示接下来要输入n个元素,n不超过10000。 第二行:n个元素序列。 输出格式 逆序对的个数。 输入样例 5 2 3 8 6 1 ...

    11087 统计逆序对

    逆序对的个数 输入样例 5 2 3 8 6 1 输出样例 5"&gt;设a[0…n 1]是一个包含n个数的数组 若在i&lt;j的情况下 有a[i]&gt;a[j] 则称 i j 为a数组的一个逆序对(inversion) 比如&lt;2 3 8 6 1&gt;有5个逆序对 ...

    计算一个数组中逆序对的个数

    设A[1..n]是包含n个不同数的数组,如果i而且A[i]&gt;A[j],则(i,j)为一个逆序组,给出时间复杂度为nlgn算法,确定n个任意元素排列中逆序组的个数。

    C++求逆序对的方法

    本文实例讲述了C++求逆序对的方法,分享给大家供大家参考之用。具体实现方法如下: #include #include using namespace std; int array[] = {3, 9, 7, 4, 5, 2}; const int size = sizeof array / sizeof *array;...

    统计数组中逆序对

    统计数组中的逆序对的个数,基于归并排序的思想,先拆分为单个元素,再合并为两个元素的数组,组内统计后,排序,进行组建统计

    逆序对计数用C语言求解

    对于给定的数组A,计算其逆序对的总数。即: image.png 【输入形式】 输入包含1组测试用例。 一个测试用例占一行,第一个整数表示...输出一个整数,表示逆序对的个数。 【样例输入】 5 1 2 3 5 4 【样例输出】 4

    剑指Offer – 面试题51. 数组中的逆序对(归并排序,求逆序对)

    输入一个数组,求出这个数组中的逆序对的总数。 示例 1: 输入: [7,5,6,4] 输出: 5 限制: 0 &lt;= 数组长度 &lt;= 50000 来源:力扣(LeetCode) 链接:...

    C++数组逆序(数组)

    给你m个整数,将其逆序输出 输入 第一行一个整数m(3 ):数的个数 第二行m个整数(空格隔开)(这些数在0-9999999之间) 输出 m个整数(空格隔开

    js代码-tmp-数组中的逆序对(结果对,超时)

    在JavaScript编程中,"数组中的逆序对"是一个常见的算法问题,主要涉及到数组操作和排序概念。逆序对指的是在一个数组(或序列)中,如果前面的元素大于后面的元素,则这两个元素构成一个逆序对。例如,在数组[7, 5,...

    逆序生成排列(c++)

    在本步骤开始时空位置的个数是n-(k-1)=n-k+1。我们把k放在从左数的第(bk+1)的空位置上。既然bk≤n-k,因此就有bk+1 ≤n-k+1,从而这样一个空位置就被确定下来了。 ………… n:把n放在剩下的位置上。

    Python字符串逆序的实现方法【一题多解】

    - 可以方便地对每个字符进行额外处理(如大写转换等)。 **缺点:** - 相比于直接使用切片,性能略低,因为涉及多次类型转换。 - 需要额外的空间来存储中间的列表。 #### 3. 使用 `reversed()` 函数 Python提供了...

    (android demo)算法实现:计算十进制数N的二进制形式中包含数字1的个数

    逆序排列余数得到二进制数1101,这就是十进制数13的二进制表示。 接下来,我们要计算二进制表示中1的个数,可以采用“按位计数”或者“位操作”方法。这里介绍两种常见的算法: 1. **逐位检查法**:遍历二进制数的...

    线性代数(同济第五版)习题答案

    在进行逆序数的习题解答时,学生需要掌握直接计算逆序对的个数的方法,以及利用奇偶排列的性质快速判断逆序数的奇偶性。例如,完全有序的排列(升序或降序)的逆序数为零,而完全逆序排列的逆序数则等于排列长度减一...

    同济线性代数第五版答案(绝对实用!!!!~)

    - 逆序数为 \(\frac{n(n-1)}{2}\),逆序对的个数随着数字的增加而增加。 **(6)13···(2n−1)(2n)(2n−2)···2** - 逆序数为 \(n(n-1)\),与第5题类似,但增加了奇数位上的逆序对。 ##### 3. 写出四阶行列式...

    线性代数第四版答案(高等教育出版社)

    逆序数是指一个排列中逆序的个数。逆序是指在排列中,如果两个数的位置与它们大小顺序相反,则这两个数就构成一个逆序。例如,在排列4132中,存在四个逆序:41、43、42、32。逆序数对于理解行列式的性质非常重要,...

    09-10春夏 线性代数期末试卷(答案)1

    (4)(4 - 1)(4 - 2)(4 - 3),其逆序数可以通过计算每对相邻元素中较大元素的个数来得到。例如,在n个数字中,每个数字都会形成(n-1)对逆序对,因此总逆序数为6n。 2. **行列式的计算**:4阶行列式的计算通常采用...

Global site tag (gtag.js) - Google Analytics