从 1 个元素开始归并,逐渐向上归并到全部元素。
链表排序,就可以使用这种「自底向上的归并排序」思想。但是又因为链表不能通过下标来划分子序列,所以操作上和数组还是有些区别的,但是思路是一样的。详见 LeetCode 148 号问题:排序链表
public class MergeSortBU { private static void merge (Comparable[] arr, int l, int mid, int r) { Comparable[] aux = Arrays.copyOfRange(arr, l, r + 1 ); int i = l, j = mid + 1 ; for (int k = l; k <= r; k++) { if (i > mid) { arr[k] = aux[j - l]; j++; } else if (j > r) { arr[k] = aux[i - l]; i++; } else if (aux[i - l].compareTo(aux[j - l]) < 0 ) { arr[k] = aux[i - l]; i++; } else { arr[k] = aux[j - l]; j++; } } } public static void sort (Comparable[] arr) { int n = arr.length; for (int i = 0 ; i < n; i += 16 ) InsertionSort.sort(arr, i, Math.min(i + 15 , n - 1 )); for (int sz = 16 ; sz < n; sz <<= 1 ) { for (int i = 0 ; i < n - sz; i += sz + sz) { if (arr[i + sz - 1 ].compareTo(arr[i + sz]) > 0 ) { merge(arr, i, i + sz - 1 , Math.min(i + sz + sz - 1 , n - 1 )); } } } } }