排序算法归并排序

Posted EileenChang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序算法归并排序相关的知识,希望对你有一定的参考价值。


算法思路

  归并排序有以下几个步骤:

  • 将数组分成左右两个部分。
  • 对左边进行排序。
  • 对右边进行排序。
  • 使用排外序的方法将左右两边合并。

时间复杂度

  根据Master公式,归并排序的时间复杂度为O(N * logN)。

代码

public class MergeSort {
    /**
     * 利用递归实现归并排序
     */
    public static void mergeSort(int[] arr, int left, int right) {
        // 当left == right时,数组在left到right范围内是有序的,直接返回
        if (ArrayUtil.isEmpty(arr) || left == right) {
            return;
        }

        // 得到数组中间位置下标
        int mid = left + ((right - left) >> 1);
        // 对左边进行排序
        mergeSort(arr, left, mid);
        // 对右边进行排序
        mergeSort(arr, mid + 1, right);
        // 将左右两边合并
        merge(arr, left, mid, right);
    }

    /**
     * 归并
     * 这个过程,时间复杂度为 O(N)
     */
    public static void merge(int[] arr, int left, int mid, int right) {
        int length = right - left + 1;
        int[] help = new int[length];
        int leftPointer = left;
        int rightPointer = mid + 1;
        int helpPointer = 0;
        while (leftPointer <= mid && rightPointer <= right) {
            if (arr[leftPointer] < arr[rightPointer]) {
                help[helpPointer++] = arr[leftPointer++];
            } else {
                help[helpPointer++] = arr[rightPointer++];
            }
        }

        if (leftPointer <= mid) {
            System.arraycopy(arr, leftPointer, help, helpPointer, mid - leftPointer + 1);
        }
        if (rightPointer <= right) {
            System.arraycopy(arr, rightPointer, help, helpPointer, right - rightPointer + 1);
        }

        System.arraycopy(help, 0, arr, left, length);
    }
}

以上是关于排序算法归并排序的主要内容,如果未能解决你的问题,请参考以下文章

排序算法之归并排序

排序算法归并排序

Java 归并排序算法

Java 归并排序算法

十大经典排序算法总结(归并排序)

[ 数据结构 -- 手撕排序算法第六篇 ] 归并排序(上)--递归方法实现