privateint[] leftArray;publicint[]sortArray(int[] nums){
leftArray =newint[nums.length >>1];sort(nums,0, nums.length);return nums;}// 对 [begin, end) 范围的数据进行归并排序privatevoidsort(int[] array,int begin,int end){if(end - begin <2)return;int mid =(begin + end)>>1;sort(array, begin, mid);sort(array, mid, end);merge(array, begin, mid, end);}// 将 [begin, mid) 和 [mid, end) 范围的序列合并成一个有序的序列privatevoidmerge(int[] array,int begin,int mid,int end){int li =0, le = mid - begin;// 左边的数组(基于leftArray)int ri = mid, re = end;// 右边的数组(基于array)int ai = begin;//array的索引for(int i = li; i < le; i++){// 拷贝左边数组到leftarray
leftArray[i]= array[begin + i];}while(li < le){// 左边数组比较完毕if(ri < re && array[ri]< leftArray[li]){// 改为 <= 会失去稳定性
array[ai++]= array[ri++];//拷贝右边数组到array}else{
array[ai++]= leftArray[li++];// 拷贝左边数组到array}}}
最终版本 - 非递归
classSolution{publicint[]sortArray(int[] nums){for(int i =1; i < nums.length; i = i<<1){MergePass(nums, i, nums.length);}return nums;}privatevoidMergePass(int[] nums,int k,int len){int i =0;while(i +(k <<1)<= len){merge(nums, i, i + k, i +(k<<1));
i +=(k<<1);}if(i + k < len){merge(nums, i, i + k, len);}}privatevoidmerge(int[] array,int begin,int mid,int end){int[] tmp =newint[end - begin];int li = begin;int ri = mid;int ai =0;while(li < mid && ri < end){if(array[ri]< array[li])
tmp[ai++]= array[ri++];else
tmp[ai++]= array[li++];}while(li < mid)
tmp[ai++]= array[li++];while(ri < end)
tmp[ai++]= array[ri++];for(int i =0; i < tmp.length; i++){
array[begin + i]= tmp[i];}}}