归并:把两个或多个已经有序的序列合并成⼀个
排序算法:归并排序【图解+代码】_哔哩哔哩_bilibili
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型一维数组
* @return int整型
*/
public int InversePairs (int[] nums) {
// write code here
if (nums.length == 0) return 0;
//使用归并排序
mergeSort(nums, 0, nums.length - 1);
}
public void mergeSort(int[] array, int left, int right) {
if (left >= right) return; // 只有一个数字,则停止划分
int mid = left + (right - left) / 2;
//递归分解
mergeSort(array, left, mid);
mergeSort(array, mid + 1, right);
//合并
merge(array, left, mid, right);
}
public void merge(int[] array, int left, int mid, int right) {
//标记左半区域未排序第一个元素
int l_pos = left;
//标记右半区域未排序第一个元素
int r_pos = mid + 1; //两个区域是从mid分开的,右边肯定从mid开始
//临时数组下标
int pos = left;
int[] tempArray = new int[array.length];
//合并
while (l_pos <= mid &&
r_pos <= right) { //两个区域任意一个循环完就停止
if (array[l_pos] < array[r_pos]) {
tempArray[pos++] = array[l_pos++];
} else {
tempArray[pos++] = array[r_pos++];
}
}
//承接上面,循环完,可能左边区域或者右边区域剩余(注意左边或者右边都是排好序的) 所以剩余区域直接复制到数组后
//左边剩余
while (l_pos <= mid) {
tempArray[pos++] = array[l_pos++];
}
//右边剩余
while (r_pos <= right) {
tempArray[pos++] = array[r_pos++];
}
//最后,tempArr复制覆盖掉array即可
while (left <= right) {
array[left] = tempArray[left];
left++;
}
}
}