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.0分

2 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论