1、排序数组 - 力扣(LeetCode)
思路:
- 先找一个中间值,然后递归左边部分和递归右半部分
- 直到左边和右边只剩一个数了就返回,然后再合并左右两个部分
- 代码:
class Solution { int[] ret; public int[] sortArray(int[] nums) { //数组长度是 nums.length ret = new int[nums.length]; mergeSort(nums, 0, nums.length-1); return nums; } public void mergeSort(int[] nums, int left, int right){ //注意:先进行判断 if(left >= right){ return; } //取中间值 int mid = (left+right)/2; // mergeSort(nums, left, mid); mergeSort(nums, mid+1, right); // int cur1 = left; int cur2 = mid+1; int i = 0; while(cur1 <= mid && cur2 <= right){ ret[i++] = nums[cur1] <= nums[cur2] ? nums[cur1++] : nums[cur2++]; } while(cur1 <= mid){ ret[i++] = nums[cur1++]; } while(cur2 <= right){ ret[i++] = nums[cur2++]; } // for(int j = left; j <= right; j++){ nums[j] = ret[j-left]; } } }
2、交易逆序对的总数 - 力扣(LeetCode)
思路:
代码:
class Solution { int[] tmp; public int reversePairs(int[] record) { tmp = new int[record.length]; return mergeSort(record, 0, record.length-1); } public int mergeSort(int[] nums, int left, int right){ if(left >= right){ return 0; } int ret = 0; //1、选择中间结点 int mid = (left+right)/2; //2、遍历左右部分 ret += mergeSort(nums, left, mid); ret += mergeSort(nums, mid+1, right); //3、一左一右的个数 int cur1 = left; int cur2 = mid+1; int i = 0; while(cur1 <= mid && cur2 <= right){ if(nums[cur1] <= nums[cur2]){ tmp[i++] = nums[cur1++]; }else{ ret += mid-cur1+1; tmp[i++] = nums[cur2++]; } } //4、剩下没有比较的 while(cur1 <= mid){ tmp[i++] = nums[cur1++]; } while(cur2 <= right){ tmp[i++] = nums[cur2++]; } //5、覆盖原数组 for(int j = left; j <= right; j++){ nums[j] = tmp[j-left]; } return ret; } }