归并排序就是一个数组分成左右两块,左边排好序,右边排好序,新建一个数组,从最小的拿,左边的小就拿左边的放到新数组里面去,右边的小就拿右边的放到新数组里面去。
public static void process2(int[] arr,int left,int right) {
if(left == right) {
return ;
}
int mid = left + ((right-left)>>1);
process2(arr,left,mid);//左边排好序
process2(arr,mid+1,right);//右边排好序
merge(arr,left,mid,right);//归并
}
public static void merge(int[] arr,int L,int M,int R) {
int[] help = new int[R-L+1];//需要借助一个新数组
int i=0;
int p1 =L;
int p2 = M + 1;
while(p1<=M&&p2<=R) {
help[i++] = (arr[p1]<=arr[p2])?arr[p1++]:arr[p2++];//分别设置一个指针,左边小就左边的放进去,右边小右边放。
}
while(p1<=M) {//如果右边的元素放完了,也就是p2越界了,只需要将左边的依次全部放入新数组就行
help[i++] = arr[p1++];
}
while(p2<=R) {//同上
help[i++] = arr[p2++];
}
for(int j=0;j<help.length;j++) {
arr[L+j] = help[j];//拷贝到arr中
}
}