/**
* 归并排序
* 时间复杂度: O(nlogn)
* 空间复杂度:O(n)
*/
public class MergeSort {
public static void main(String[] args) {
int[] b = {3, 1, 5, 4, 6, 90, 48, 32, 78};
System.out.println(Arrays.toString(sort(b)));
}
private static int[] sort(int[] array) {
//递归的终止条件
if (array.length <= 1) {
return array;
}
int num = array.length / 2;
//对左侧数组进行排序 先拆分 然后排序后再合并
int[] left = sort(Arrays.copyOfRange(array, 0, num));
//对右侧数组进行排序 先拆分 然后排序后再合并
int[] right = sort(Arrays.copyOfRange(array, num, array.length));
return mergeTwoArray(left, right);
}
/**
* 对两个有序的数组进行合并处理
*
* @param left 左侧有序数组
* @param right 右侧有序数组
* @return 合并后的数组
*/
private static int[] mergeTwoArray(int[] left, int[] right) {
int i = 0;//左侧数组的索引
int j = 0;//右侧数组的索引
int k = 0;//新生成数组的索引
int[] newArray = new int[left.length + right.length];
while (i < left.length && j < right.length) {
if (left[i] <= right[j]) {
newArray[k++] = left[i++];
} else {
newArray[k++] = right[j++];
}
}
while (i < left.length) {
newArray[k++] = left[i++];
}
while (j < right.length) {
newArray[k++] = right[j++];
}
return newArray;
}
}
输入:
{3, 1, 5, 4, 6, 90, 48, 32, 78}
输出:
[1, 3, 4, 5, 6, 32, 48, 78, 90]