归并排序采用的是分治的思想,首先divide,把数组二分,然后再合并分开的两个数组,这里和并的两个数组分别都是有序的。合并后让整个start和end区间内的数组有序。
public static void main(String[] args) {
int [] arr = {1,1,1,1,1,1,2,1,1,1,1,1,1,1};
int [] tmp = new int[arr.length] ;
divide(arr,0,arr.length-1,tmp);
for(int i:arr){
System.out.print(i+" ");
}
}
private static void divide(int[] arr, int start, int end,int [] tmp) {
if(start < end){
int mid = (start+end)/2;
divide(arr,start,mid,tmp);
divide(arr,mid+1,end,tmp);
merge(arr,start,mid,end,tmp);
}
return ;
}
private static void merge(int[] arr, int start, int mid, int end,int [] tmp) {
int i = start;
int j = mid +1;
int k = 0;
while(i <= mid && j <= end){
if(arr[i] <= arr[j]){
tmp[k++] = arr[i++];
}else{
tmp[k++] = arr[j++];
}
}
while(i <= mid){
tmp[k++] = arr[i++];
}
while(j <= end){
tmp[k++] = arr[j++];
}
for(i = 0 ; i < k;i++){
arr[start+i] = tmp[i];
}
}