其实就是二路归并排序,排序的同时记录交换次数就行了。
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)
分享到:
相关推荐
对于求逆序对的问题,我们可以维护一个数组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 ...
逆序对的个数 输入样例 5 2 3 8 6 1 输出样例 5">设a[0…n 1]是一个包含n个数的数组 若在i<j的情况下 有a[i]>a[j] 则称 i j 为a数组的一个逆序对(inversion) 比如<2 3 8 6 1>有5个逆序对 ...
设A[1..n]是包含n个不同数的数组,如果i而且A[i]>A[j],则(i,j)为一个逆序组,给出时间复杂度为nlgn算法,确定n个任意元素排列中逆序组的个数。
本文实例讲述了C++求逆序对的方法,分享给大家供大家参考之用。具体实现方法如下: #include #include using namespace std; int array[] = {3, 9, 7, 4, 5, 2}; const int size = sizeof array / sizeof *array;...
统计数组中的逆序对的个数,基于归并排序的思想,先拆分为单个元素,再合并为两个元素的数组,组内统计后,排序,进行组建统计
对于给定的数组A,计算其逆序对的总数。即: image.png 【输入形式】 输入包含1组测试用例。 一个测试用例占一行,第一个整数表示...输出一个整数,表示逆序对的个数。 【样例输入】 5 1 2 3 5 4 【样例输出】 4
输入一个数组,求出这个数组中的逆序对的总数。 示例 1: 输入: [7,5,6,4] 输出: 5 限制: 0 <= 数组长度 <= 50000 来源:力扣(LeetCode) 链接:...
给你m个整数,将其逆序输出 输入 第一行一个整数m(3 ):数的个数 第二行m个整数(空格隔开)(这些数在0-9999999之间) 输出 m个整数(空格隔开
在JavaScript编程中,"数组中的逆序对"是一个常见的算法问题,主要涉及到数组操作和排序概念。逆序对指的是在一个数组(或序列)中,如果前面的元素大于后面的元素,则这两个元素构成一个逆序对。例如,在数组[7, 5,...
在本步骤开始时空位置的个数是n-(k-1)=n-k+1。我们把k放在从左数的第(bk+1)的空位置上。既然bk≤n-k,因此就有bk+1 ≤n-k+1,从而这样一个空位置就被确定下来了。 ………… n:把n放在剩下的位置上。
- 可以方便地对每个字符进行额外处理(如大写转换等)。 **缺点:** - 相比于直接使用切片,性能略低,因为涉及多次类型转换。 - 需要额外的空间来存储中间的列表。 #### 3. 使用 `reversed()` 函数 Python提供了...
逆序排列余数得到二进制数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。逆序数对于理解行列式的性质非常重要,...
(4)(4 - 1)(4 - 2)(4 - 3),其逆序数可以通过计算每对相邻元素中较大元素的个数来得到。例如,在n个数字中,每个数字都会形成(n-1)对逆序对,因此总逆序数为6n。 2. **行列式的计算**:4阶行列式的计算通常采用...