int res = 0;
/**
* 數組中的逆序對
* <p>
* 歸併排序求逆序對
*
* @param arr
* @return
*/
public int inversePairs(int[] arr) {
if (null == arr || 0 == arr.length) return 0;
mergeSort(arr, 0, arr.length - 1);
return res;
}
private void mergeSort(int[] arr, int left, int right) {
if (left < right) {
int mid = left + ((right - left) >> 1);
mergeSort(arr, left, mid);
mergeSort(arr, mid + 1, right);
merge(arr, left, mid, right);
}
}
private void merge(int[] arr, int left, int mid, int right) {
int[] t = new int[right - left + 1];
int less = left;
int more = mid + 1;
int index = 0;
while (less <= mid && more <= right) {
if (arr[less] > arr[more]) {
t[index++] = arr[more++];
res += (mid - less + 1);
} else {
t[index++] = arr[less++];
}
}
while (less <= mid) {
t[index++] = arr[less++];
}
while (more <= right) {
t[index++] = arr[more++];
}
for (int i = 0; i < t.length; i++) {
arr[left + i] = t[i];
}
}
劍指Offer學習-面試題51:數組中的逆序對
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.