归并排序

34 阅读2分钟

归并排序

  • 在 main 方法中,初始化一个整数数组 arr,然后打印出排序前的数组内容。创建一个临时数组 temp,其长度与 arr 相同,为后续排序过程提供空间。调用 mergeSort 方法启动归并排序过程,排序完成后,再次打印数组,以显示排序后的结果。
  • printArr 方法用于打印数组的所有元素,该方法使用增强 for 循环遍历数组,并将每个元素打印到控制台。
  • mergeSort 方法是归并排序的核心,它使用递归方式将数组不断分割成较小的子数组,直到每个子数组仅包含一个元素。通过不断地分割和合并子数组,最终实现整个数组的排序。
  • merge 方法是用于合并两个已排序的子数组为一个新的已排序数组。它通过比较两个子数组的元素大小,将较小的元素顺序放入临时数组 temp 中。当其中一个子数组的元素全部放入 temp 后,将另一个子数组的剩余元素也依次放入。最后,使用 System.arraycopy 方法将 temp 中的元素复制回原始数组 arr 中对应的位置。

public class MergeSort {


    public static void main(String[] args) {

        int[] arr = {5, 4, 10, 6, 55, 2};
        System.out.print("排序前:");
        printArr(arr);
        int[] temp = new int[arr.length];
        mergeSort(arr, 0, arr.length - 1, temp);
        System.out.print("排序后:");
        printArr(arr);
    }


    public static void printArr(int[] arr) {
        for (int i : arr) {
            System.out.print(i + " ");
        }
        System.out.println();


    }

    public static void mergeSort(int[] arr, int start, int end, int[] temp) {
        if (start >= end) {
            return;
        }

        int mid = start + (end - start) / 2;

        mergeSort(arr, start, mid, temp);
        mergeSort(arr, mid + 1, end, temp);
        merge(arr, start, end, mid, temp);

    }

    public static void merge(int[] arr, int start, int end, int mid, int[] temp) {

        int l = start;
        int r = mid+1;
        int k = 0;
        while (l <= mid && r <= end) {
            if (arr[l] <= arr[r]) {
                temp[k++] = arr[l++];
            } else {
                temp[k++] = arr[r++];
            }
        }

        while (l <= mid) {
            temp[k++] = arr[l++];
        }
        while (r <= end) {
            temp[k++] = arr[r++];
        }
        System.arraycopy(temp, 0, arr, start, end - start + 1);
    }
}