归并排序,是稳定的排序算法,使用分治法,先把数组分到最小,再递归合成有序数组。它的时间复杂度O(nlogn)空间复杂度T(n)。
算法过程:
将数组递归分成两半,一直分到只有一个元素
然后从只有一个元素开始,把有序的数组合并成一个有序数组
外部调用函数sort
public int[] sort(int[] arr) {
if (arr.length < 2) {
return arr;
}
int middle = arr.length / 2;
if (arr.length % 2 == 1) {
middle++;
}
int[] left = Arrays.copyOfRange(arr, 0, middle);
int[] right = Arrays.copyOfRange(arr, middle, arr.length);
return merge(sort(left), sort(right));
}
int[] merge(int[] left, int[] right) {
if (left == null || left.length == 0) {
return right;
}
if (right == null || right.length == 0) {
return left;
}
int[] result = new int[left.length + right.length];
int indexLeft = 0;
int indexRight = 0;
int index = 0;
while (indexLeft < left.length && indexRight < right.length) {
if (left[indexLeft] < right[indexRight]) {
result[index++] = left[indexLeft++];
} else {
result[index++] = right[indexRight++];
}
}
while (indexLeft < left.length ){
result[index++] = left[indexLeft++];
}
while (indexRight<right.length){
result[index++] = right[indexRight++];
}
return result;
}