归并排序
先分 递归不断的二分 再合并
合并过程中使用三个指针 最后哪一个数组未合并完直接追加到目标数组尾部
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 将给定数组排序
* @param arr int整型一维数组 待排序的数组
* @return int整型一维数组
*/
public int[] MySort (int[] arr) {
// write code here
sort(arr,0,arr.length-1);
return arr;
}
public void sort(int[] arr,int left ,int right){
if(left>=right){
return ;
}
int mid = left +(right -left)/2;
sort(arr,left,mid);
sort(arr,mid+1,right);
merge(arr,left,mid,mid+1,right);
}
public void merge(int[] arr,int leftBegin,int leftEnd,int rightBegin,int rightEnd){
int leftLen = leftEnd - leftBegin+1;
int[] leftArr = new int[leftLen];
for(int i=0;i<leftLen;i++){
leftArr[i] = arr[leftBegin+i];
}
int rightLen = rightEnd - rightBegin+1;
int[] rightArr = new int[rightLen];
for(int i=0;i<rightLen;i++){
rightArr[i] = arr[rightBegin+i];
}
int i = 0;
int j=0;
int k =0;
while (i<leftArr.length&&j<rightArr.length){
if (leftArr[i]<=rightArr[j]){
arr[leftBegin+k] = leftArr[i];
k++;
i++;
}else {
arr[leftBegin+k] = rightArr[j];
k++;
j++;
}
}
while (i<leftArr.length){
arr[leftBegin+k] = leftArr[i];
k++;
i++;
}
while (j<rightArr.length){
arr[leftBegin+k] = rightArr[j];
k++;
j++;
}
}
}