归并:把两个或多个已经有序的序列合并成⼀个 排序算法:归并排序【图解+代码】_哔哩哔哩_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++; } } }