1. 程式人生 > 實用技巧 >788.逆序對的數量

788.逆序對的數量

給定一個長度為n的整數數列,請你計算數列中的逆序對的數量。
逆序對的定義如下:對於數列的第 i 個和第 j 個元素,如果滿足 i < j 且 a[i] > a[j],則其為一個逆序對;否則不是。

輸入格式

第一行包含整數n,表示數列的長度。
第二行包含 n 個整數,表示整個數列。

輸出格式

輸出一個整數,表示逆序對的個數。

資料範圍

1≤n≤100000

輸入樣例:

6
2 3 4 5 6 1

輸出樣例:

5

參考程式碼

import java.util.Scanner;

public class Main {

	public static long mergeSort(int[] a, int l, int r) {
		if (l >= r) {
			return 0;
		}

		int mid = l + r >> 1;
		long res = mergeSort(a, l, mid) + mergeSort(a, mid + 1, r);
		int i = l, j = mid + 1, k = 0;
		int[] tmp = new int[r - l + 1];
		while (i <= mid && j <= r) {
			if (a[i] <= a[j]) {
				tmp[k++] = a[i++];
			} else {
				tmp[k++] = a[j++];
				res += mid - i + 1;
			}
		}

		while (i <= mid) {
			tmp[k++] = a[i++];
		}
		while (j <= r) {
			tmp[k++] = a[j++];
		}

		for (i = l, j = 0; i <= r; i++, j++) {
			a[i] = tmp[j];
		}

		return res;
	}

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		int n = sc.nextInt();
		int[] a = new int[n];

		for (int i = 0; i < n; i++) {
			a[i] = sc.nextInt();
		}

		System.out.println(mergeSort(a, 0, n - 1));

		sc.close();
	}
}