📜  java 简答中的合并排序算法 - Java (1)

📅  最后修改于: 2023-12-03 15:01:34.460000             🧑  作者: Mango

Java 中的合并排序算法

合并排序(Merge Sort)是一种经典的排序算法,它采用分治策略(Divide and Conquer)将一个大区间划分成两个小区间递归排序,再将排好序的小区间合并成一个有序的大区间,最终完成排序。

算法步骤

合并排序算法的步骤如下:

  1. 将数组等分为两个子数组,分别递归调用合并排序算法,直到子数组只有一个元素为止。
  2. 将排好序的子数组合并为一个有序的数组,具体操作是比较两个子数组的首元素,将较小的元素放入结果数组中,并将其指针向后移动,直到某一个子数组被遍历完为止,将另一个子数组剩余的元素直接放入结果数组中。
  3. 返回有序的数组作为最终结果。
实现代码

以下为 Java 实现合并排序算法的示例代码:

public class MergeSort {
    public static void mergeSort(int[] arr) {
        if (arr == null || arr.length < 2) {
            return;
        }
        sortProcess(arr, 0, arr.length - 1);
    }

    public static void sortProcess(int[] arr, int left, int right) {
        if (left == right) {
            return;
        }
        int mid = left + ((right - left) >> 1);
        sortProcess(arr, left, mid);
        sortProcess(arr, mid + 1, right);
        merge(arr, left, mid, right);
    }

    public static void merge(int[] arr, int left, int mid, int right) {
        int[] temp = new int[right - left + 1];
        int i = 0;
        int p1 = left;
        int p2 = mid + 1;
        while (p1 <= mid && p2 <= right) {
            temp[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];
        }
        while (p1 <= mid) {
            temp[i++] = arr[p1++];
        }
        while (p2 <= right) {
            temp[i++] = arr[p2++];
        }
        for (i = 0; i < temp.length; i++) {
            arr[left + i] = temp[i];
        }
    }
}
时间复杂度

合并排序算法的时间复杂度为 O(nlogn),其中 n 为数组的长度。虽然它的时间复杂度和快速排序算法相同,但是它的稳定性更好,在某些场景下更加适用。