1. 程式人生 > 其它 >36. 陣列中逆序對的個數

36. 陣列中逆序對的個數

技術標籤:劍指offer--JAVA實現

題目描述:在陣列中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個陣列中的逆序對的總數P.

思路:本質是歸併排序,在比較時加入全域性變數 count 進行記錄逆序對的個數,若
data[start] >= data[index] ,則 count 值為 mid+1-start
程式碼實現:

int count = 0;
public int InversePairs(int [] array) {
	if(array==null)
		return 0;
	mergeSort(array,0,array.length-1);
	return count;
}

private void mergeSort(int[] data,int start,int end) {
	int mid = (start + end) / 2;
	if (start < end) {
		mergeSort(data, start, mid);
		mergeSort(data, mid + 1, end);
		merge(data, start, mid, end);
	}
}
private void merge(int[] data,int start,int mid,int end) {
	int arr[] = new int[end - start + 1];
	int c = 0;
	int s = start;
	int index = mid + 1;
	while (start <= mid && index <= end) {
		if (data[start] < data[index]) {
			arr[c++] = data[start++];
		} else {
			arr[c++] = data[index++];
			count += mid +1 - start;
			count %= 1000000007;
		}
	}
	while (start <= mid) {
		arr[c++] = data[start++];
	}
	while (index <= end) {
		arr[c++] = data[index++];
	}
	for (int d : arr) {
		data[s++] = d;
	}
}