Leetcode链接:. - 力扣(LeetCode)
归并:将原始数组划分为若干个子数组,然后将这些子数组分别排序,最后再将已排序的子数组合并成一个有序的数组。是一种分治思想
思路:
1.分
2.治
3.怎么治
将两个已经有序的子序列合并成一个有序序列,比如最后一次合并要将[4,5,7,8]和[1,2,3,6]两个已经有序的子序列,合并为最终序列[1,2,3,4,5,6,7,8]
3.1定义一个help数组,定义两个指针p1和p2,p1指向第一个数组的第一个位置,p2指向第二个数组的第二个位置
3.2 从头开始判断两个数组中的数谁大谁小,小的放入help数组中,指针向后移动,直到有一个数组的所有数都放入了help数组中,然后直接把另一个数组的剩下数放入到help数组中去。最终help数组为两个已经有序的子序列合并的那一个有序序列
class Solution {public int[] sortArray(int[] nums) {process(nums,0,nums.length-1);return nums;}public void process(int[] nums ,int l,int r){if(l==r){return;}int midIndex=l+((r-l)>>1);process(nums,l,midIndex);process(nums,midIndex+1,r);//将两个已经有序的子序列合并成一个有序序列merge(nums,l,midIndex,r);}public void merge(int[] nums,int l,int midIndex,int r){int[] help=new int[r-l+1];int i=0;int p1=l;int p2=midIndex+1;while(p1<=midIndex && p2<=r){help[i++]=nums[p1]<=nums[p2] ? nums[p1++] :nums[p2++];}while(p1<=midIndex){help[i++]=nums[p1++];}while(p2<=r){help[i++]=nums[p2++];}for(int j=0;j<help.length;j++){nums[l+j]=help[j];}}
}