由于归并排序是平均分割子序列,所以最好、最坏、平均时间复杂度都是 O(nlogn), 属于稳定排序
    从代码不难看出:归并排序的空间复杂度是 O(n/2 + logn) = O(n)

    1. private T[] leftArray;
    2. @Override
    3. protected void sort() {
    4. leftArray = (T[]) new Comparable[(array.length >> 1)];
    5. sort(0, array.length);
    6. }
    7. private void sort(int begin, int end) {
    8. if (end - begin < 2) {
    9. return;
    10. }
    11. int mid = (begin + end) >> 1;
    12. sort(begin, mid);
    13. sort(mid, end);
    14. merge(begin, mid, end);
    15. }
    16. /**
    17. * 将[begin, mid] 和 [mid, end) 范围的序列合并成一个有序序列
    18. */
    19. private void merge(int begin, int mid, int end) {
    20. int li = 0, le = mid - begin;
    21. int ri = mid, re = end;
    22. int ai = begin;
    23. //将左边数组存进leftArray中
    24. for (int i = li; i < le; i++) {
    25. leftArray[i] = array[begin + i];
    26. }
    27. //就可以开始进行挪动元素了
    28. while (li < le) {
    29. if (ri < re && cmp(array[ri], leftArray[li]) > 0) {
    30. array[ai++] = array[ri++];
    31. }else {
    32. array[ai++] = leftArray[li++];
    33. }
    34. }
    35. }

    迭代版:

    1. public static void merge_sort(int[] arr) {
    2. int[] nums = new int[arr.length];
    3. for (int i = 1; i < arr.length; i++) {
    4. for (int j = 0; j < arr.length; j += i * 2) {
    5. int low = j, mid = Math.min(i + j, arr.length), high = Math.min(j + i * 2, arr.length);
    6. int k = low;
    7. int start1 = low, end1 = mid;
    8. int start2 = mid, end2 = high;
    9. while (start1 < end1 && start2 < end2) {
    10. nums[k++] = arr[start1] < arr[start2] ? arr[start1++] : arr[start2++];
    11. }
    12. while (start1 < end1) {
    13. nums[k++] = arr[start1++];
    14. }
    15. while (start2 < end2) {
    16. nums[k++] = arr[start2++];
    17. }
    18. }
    19. int[] temp = arr;
    20. arr = nums;
    21. nums = temp;
    22. }
    23. nums = arr;
    24. }