/**
* @Description 归并排序
* 递归排序就是在逻辑上将一个数组分成两个数组,再将两个数组再各自拆分成两个数组,
* 以此类推,然后再进行排序
* @auther Eleven
* @create 2020-04-05 14:02
**/
public class MergeSort {
public static void main(String[] args) {
//int[] arr = new int[]{1,9,5,2,6,7,10,11};
int[] arr = new int[]{3,1,2};
System.out.println(Arrays.toString(arr));
mergeSort(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));
}
/**
* 归并排序
* @param arr 数组
* @param low 最小索引
* @param high 最大索引
*/
public static void mergeSort(int[] arr,int low,int high){
int middle = (low+high)/2;
if(low<high) {
//处理左边
mergeSort(arr, 0, middle);
//处理右边
mergeSort(arr, middle + 1, high);
//归并
merge(arr, low, middle, high);
}
}
/**
* 归并
* @param arr 数组
* @param low 最小索引
* @param middle 中间位置索引
* @param high 最大索引
*/
public static void merge(int[] arr,int low,int middle,int high){
//首先定义一个临时数组用于存储归并后的数组
int[] temp = new int[high-low+1];
//第一个数组遍历的起始位置
int i = low;
//第二个数组遍历的起始位置
int j = middle+1;
//标记temp数组的序列
int index = 0;
//开的对两个数组进行遍历
//当i小于middle且j小于high时
while(i<=middle&&j<=high){
//判断两个数组的值的大小哪个数据小就放到临时数组中
if (arr[i]<=arr[j]){
//小的数据放到临时数组中
temp[index] = arr[i];
//小的数字所在数组的下标向后移动一位
i++;
}else{
//小的数据放到临时数组中
temp[index] = arr[j];
//小的数字所在数组的下标向后移动一位
j++;
}
//临时数组的下标向后移动一位
index++;
}
//如果不满足以上两个条件的其他数据的多余数据的处理
while (i<=middle){
temp[index] = arr[i];
i++;
index++;
}
while (j<=high){
temp[index] = arr[j];
j++;
index++;
}
//将这些数据放回原数组
for(int k = 0;k<temp.length;k++){
arr[k+low] = temp[k];
}
}
}
可以参考下该文章的图解
[图解] 归并排序