归并排序采用的是分治思想
public class Main {
public static void main(String[] args) {
int []arr = {4,5,6,2,1,9};
int left = 0;
int right = arr.length-1;
int[] temp = new int[arr.length];
asort(arr,left,right,temp);
System.out.println(Arrays.toString(temp));
}
/**
* 归并查找
* @param arr
* @param left
* @param right
* @param mid
* @return
*/
public static void mergeSort(int[] arr,int left,int right,int mid,int[] temp){
int i = left;
int n = left;
int j = mid+1;
while (n<=mid && j<=right && i<=right){
if(arr[n]>arr[j]){
//左边数>右边数,存储右边数,左边数不变,右边数索引增加
temp[i++] = arr[j++];
}else{
//左边数<右边数,存储左边数,右边数不变,左边数索引增加
temp[i++] = arr[n++];
}
}
//右边全部比较存储完毕,左边没比完,则直接将左边的放入数组中
while(n<=mid && i<=right){
temp[i++] = arr[n++];
}
//左边全部比较存储完毕,右边没比完,则直接将右边的放入数组中
while(j<=right && i<=right){
temp[i++] = arr[j++];
}
//修改原数组
for(int m = left;m<=right;m++){
arr[m]=temp[m];
}
}
/**
* 递归执行
* @param arr
* @param left
* @param right
* @param temp
*/
public static void asort(int[] arr,int left,int right,int[] temp){
if(right>left){
int mid = (left+right)/2;
asort(arr,left,mid,temp);
asort(arr,mid+1,right,temp);
mergeSort(arr,left,right,mid,temp);
}else{
temp[0]=arr[0];
}
}
}