思路分析:
把要排序的数组按照中值进行分割成两份,再把每一份分割成两份,直到每一份只有一个元素就不再分割,递归返回,把这返回的两份元素按照大小顺序加入到临时数组temp中,最后再把temp中的数据拷贝到原数组的原位置上,递归即可
代码展示:
package com.monster.sort;
import java.util.Arrays;
/**
* @author Monster
* @version v1.0
* @time 03-19-2021 09:51:21
* @description:
*/
public class MargeSort {
public static void main(String[] args) {
int[] arr = new int[]{8, 4, 5, 7, 1, 3, 6, 2, 0, 0, 2, 3, 9};
int[] temp = new int[arr.length];
margeSort(arr, 0, arr.length - 1, temp);
System.out.println(Arrays.toString(arr));
}
// 时间复杂度(n - 1)
// 递归,每次递归都把数组平分为两半, 直到拆成一个原素一份,再合并
public static void margeSort(int[] arr, int left, int right, int[] temp) {
if (left < right) {
// 以中值进行分割
int mid = (left + right) / 2;
margeSort(arr, left, mid, temp);
margeSort(arr, mid + 1, right, temp);
// 合并,按顺序进行合并
marge(arr, left, mid, right, temp);
}
}
public static void marge(int[] arr, int left, int mid, int right, int[] temp) {
int i = left;
int j = mid + 1;
int t = 0; // 临时数组temp的索引
while (i <= mid && j <= right) {
if (arr[i] <= arr[j]) {
temp[t] = arr[i];
i++;
} else {
temp[t] = arr[j];
j++;
}
t++;
}
while (i <= mid) {
temp[t] = arr[i];
i++;
t++;
}
while (j <= right) {
temp[t] = arr[j];
j++;
t++;
}
t = 0;
int tempLeft = left;
while (tempLeft <= right) {
arr[tempLeft] = temp[t];
tempLeft++;
t++;
}
}
}