写一个计算数组逆序数个数的JAVA代码
时间: 2024-10-09 17:04:09 浏览: 42
在Java中,我们可以使用双指针法来计算数组中逆序对的数量。逆序对是指数组中的两个元素i和j,满足i < j并且a[i] > a[j]。以下是计算逆序对数的简单示例:
```java
public class Main {
public static int countInversions(int[] nums) {
if (nums == null || nums.length == 0) {
return 0;
}
// 使用 merge sort 分治法,每一步都将数组分为两半并递归处理,同时统计逆序对
int inversions = 0;
mergeSort(nums, 0, nums.length - 1, inversions);
return inversions;
}
private static void mergeSort(int[] nums, int left, int right, int& inversions) {
if (left < right) {
int mid = left + (right - left) / 2;
// 对左半部分进行排序,并统计左半部分的逆序对
mergeSort(nums, left, mid, inversions);
// 对右半部分进行排序,并统计右半部分的逆序对
mergeSort(nums, mid + 1, right, inversions);
// 合并过程中更新逆序对计数
merge(nums, left, mid, right, inversions);
}
}
private static void merge(int[] nums, int left, int mid, int right, int& inversions) {
int[] temp = new int[right - left + 1];
int i = left, j = mid + 1, k = 0;
while (i <= mid && j <= right) {
if (nums[i] <= nums[j]) {
temp[k++] = nums[i++];
} else {
temp[k++] = nums[j++]; // 如果nums[i] > nums[j],即逆序对
inversions++; // 逆序对数量增加1
}
}
// 将剩余未合并的部分复制到临时数组
while (i <= mid) {
temp[k++] = nums[i++];
}
while (j <= right) {
temp[k++] = nums[j++];
}
// 将临时数组内容复制回原数组
for (int l = 0; l < temp.length; l++) {
nums[left + l] = temp[l];
}
}
public static void main(String[] args) {
int[] nums = {5, 2, 4, 6, 1};
System.out.println("The number of inversion pairs is: " + countInversions(nums));
}
}
```
这个代码首先通过`countInversions`函数初始化逆序对计数器,然后使用merge sort算法进行排序,同时在合并的过程中统计逆序对。
阅读全文