归并排序
https://www.cnblogs.com/chengxiao/p/6194356.html
// merge_sort(p…r) = merge(merge_sort(p…q), merge_sort(q+1…r))
// p >= r 不用再继续分解
public static void mergeSort() {
int[] array = {2, 34, 5, 1, 62, 56, 7, 3};
int[] temp = new int[8];
sort(array, 0, array.length - 1, temp);
System.out.println(Arrays.toString(array));
}
public static void sort(int[] array, int left, int right, int[] temp) {
if (left < right) {
int mid = (left + right) / 2;
sort(array, left, mid, temp);
sort(array, mid + 1, right, temp);
merge(array, left, mid, right, temp);
}
}
private static void merge(int[] array, int left, int mid, int right, int[] temp) {
int i = left;
int j = mid + 1;
int t = 0;
while (i <= mid && j <= right) {
if (array[i] <= array[j]) {
temp[t++] = array[i++];
} else {
temp[t++] = array[j++];
}
}
while (i <= mid) {
temp[t++] = array[i++];
}
while (j <= right) {
temp[t++] = array[j++];
}
t = 0;
while (left <= right) {
array[left++] = temp[t++];
}
}
归并排序总结:
稳定的排序
空间复杂度为O(1)
时间复杂度:O(nlogn)