将元素数量除以二拆分,一直拆到无法拆分,再将底层的数组合并排序作为有序数组传给上一层,最终得到有序数组
public static void main(String[] args) {
int[] arr = {12,14,16,15,13,18,11,17,10,3,6,7,2,8,9,20};
mergeSort(arr,0,arr.length - 1);
System.out.println("排序完成");
}
//分组
/**
*
* @param arr 数组
* @param start 排序起始位置
* @param end 排序结束位置
*/
private static void mergeSort(int[] arr,int start,int end) {
//分组
int middle = (start + end)/2;
//区间内有数据
if(start < end){
//处理左边数据
mergeSort(arr,start,middle);
//处理右边数组
mergeSort(arr,middle + 1,end);
//归并处理
merge(arr,start,middle,end);
}
}
//处理
/**
*
* @param arr 数组
* @param start 起始位置
* @param middle 分组中间位置
* @param end 结束位置
*/
private static void merge(int[] arr, int start, int middle, int end) {
//定义数组临时存排序后的数据
int[] temp = new int[end - start + 1];
//第一组数据第一位下标
int i = start;
//第二组数据第一位下标
int j = middle + 1;
//临时数组中保存数据下标,从0开始
int index = 0;
//遍历数组
//升序
/*while (i <= middle && j<= end){
//第一组数据值小
if(arr[i] <= arr[j]){
//把更小的数据存入临时数组
temp[index] = arr[i];
//下标向后一位
i++;
}else {
//把更小的数据存入临时数组
temp[index] = arr[j];
//下标向后一位
j++;
}
//临时数组下标向后一位
index++;
}*/
//降序
while (i <= middle && j<= end){
//第一组数据值大
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 <= end){
//值放入临时数组
temp[index] = arr[j];
//下标后移
j++;
index++;
}
//临时数组的数据放回到原数组
for (int k = 0; k < temp.length; k++) {
arr[k+start] = temp[k];
}
}