912. 排序数组
给你一个整数数组
nums
,请你将该数组升序排列。示例 1:
输入:nums = [5,2,3,1] 输出:[1,2,3,5]
示例 2:
输入:nums = [5,1,1,2,0,0] 输出:[0,0,1,1,2,5]
提示:
1 <= nums.length <= 5 * 10(4)
-5 * 10(4) <= nums[i] <= 5 * 10(4)
递归函数,定义递归函数mergeSort
将nums
数组中[left,right]
区间元素进行升序排序。
递归内部逻辑,将[left,mid][mid+1,right]
两个区间分别进行排序,排序完的两个独立的升序的区间,利用双指针进行合并。
递归的出口是left>=right
,表示区间已经没有元素或者只有一个元素的情况,此时不需要进行排序操作。
内部递归逻辑维护意义的代码,实际上是利用双指针将两个有序的区间[left,mid][mid+1,right]
进行合并的过程。
双指针遍历两个部分,将小的尾插到tmp
临时数组中,直到所有元素都存储在tmp
数组中。
定义将升序区间[left,mid][mid+1,right]
两个区间分割出两个待处理的区间,[left,cur1-1][cur1,mid][mid+1,cur2-1][cur2,right]
。
定义end1=mid,end2=right
,得到最终的区间划分,[left,cur1-1][cur1,end1][mid+1,cur2-1][cur2,end2]
。
[left,cur1-1]
和[mid+1,cur2-1]
全都是已经处理完的区间,[cur1,end1]
和[cur2,end2]
是待处理的区间。
定义tmp
数组,和index
,[0,index-1][index,right-left]
区间划分。
总区间长度是right-left+1,[0,index-1]
表示处理完毕的区间,[index,right-left]
表示待处理的区间。
while (cur1 <= end1 && cur2 <= end2)
tmp[index++] =
nums[cur1] <= nums[cur2] ? nums[cur1++] : nums[cur2++];
不断地维护nums
和tmp
区间的定义。当有一个区间待处理区间没有元素时,循环退出。此时需要把另一个还没有处理完的区间剩余元素添加到tmp
数组中。
while (cur1 <= end1)
tmp[index++] = nums[cur1++];
while (cur2 <= end2)
tmp[index++] = nums[cur2++];
维护区间定义。
for (int i = left; i <= right; i++)
nums[i] = tmp[i - left];
最后将tmp
临时数组,排好序的依次赋值给nu