原题链接:信息学奥赛一本通T1311-求逆序对
import java.util.Scanner;
public class Main {
static int[]a;
static int[]temp;
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
a=new int[n];
temp=new int[n+1];
for (int i = 0; i < n; i++)
a[i]=sc.nextInt();
long ans = mergeSort(a, 0, n-1);
System.out.println(ans);
}
static long mergeSort(int []a, int left, int right) {
//定义终止条件
if (left >= right)
return 0;
//求中间值
int mid = (left + right) >> 1;
//不断进行递归,使得数组呈现有序递增
long count = mergeSort(a, left, mid) + mergeSort(a, mid + 1, right);
//i为左数组下标,j为右数组下标,pos为临时数组下标
int i = left, j = mid + 1;
int pos = 1;
while (i <= mid && j <= right) {
//如果a[i]<a[j],那么A[j]时右数组中第一个大于a[i]的元素,a在左右两数组是升序的,
//那么从mid+1到j-1的元素都小于a[i],则a[i]逆序数为j-mid-i
if (a[i] <= a[j]) {
temp[pos] = a[i];
++i;
count += (j - mid) - 1;
}
else {
temp[pos] = a[j];
++j;
}
pos++;
}
//左数组是否全部遍历
for (int k = i; k <= mid; k++) {
temp[pos++] = a[k];
count += (j - mid) - 1;
}
//右数组是否全部遍历
for (int k = j; k <= right; k++)
temp[pos++] = a[k];
pos = 1;
//复制数组
for (int k = left; k <= right; k++,pos++) {
a[k] = temp[pos];
}
return count;
}
}0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复