Java实现归并排序算法

大家好,我是锋哥。今天分享关于【Java实现归并排序算法】**面试题。**希望对大家有帮助;

Java实现归并排序算法

超硬核AI学习资料,现在永久免费了!

下面是一个用 Java 实现的归并排序算法:

复制代码
public class MergeSort {

    public static void main(String[] args) {
        int[] arr = { 12, 7, 5, 14, 3, 8, 1, 9, 6, 11 };
        System.out.println("原数组:");
        printArray(arr);
        
        mergeSort(arr, 0, arr.length - 1);
        
        System.out.println("排序后数组:");
        printArray(arr);
    }

    // 归并排序函数
    public static void mergeSort(int[] arr, int left, int right) {
        if (left < right) {
            // 找到中点
            int mid = left + (right - left) / 2;

            // 递归分治排序
            mergeSort(arr, left, mid);
            mergeSort(arr, mid + 1, right);

            // 合并两个已排序的子数组
            merge(arr, left, mid, right);
        }
    }

    // 合并两个已排序的子数组
    public static void merge(int[] arr, int left, int mid, int right) {
        // 找到两个子数组的大小
        int n1 = mid - left + 1;
        int n2 = right - mid;

        // 创建临时数组
        int[] leftArr = new int[n1];
        int[] rightArr = new int[n2];

        // 将数据拷贝到临时数组
        System.arraycopy(arr, left, leftArr, 0, n1);
        System.arraycopy(arr, mid + 1, rightArr, 0, n2);

        // 合并两个临时数组
        int i = 0, j = 0, k = left;
        while (i < n1 && j < n2) {
            if (leftArr[i] <= rightArr[j]) {
                arr[k] = leftArr[i];
                i++;
            } else {
                arr[k] = rightArr[j];
                j++;
            }
            k++;
        }

        // 如果左边的数组还有剩余,拷贝到原数组
        while (i < n1) {
            arr[k] = leftArr[i];
            i++;
            k++;
        }

        // 如果右边的数组还有剩余,拷贝到原数组
        while (j < n2) {
            arr[k] = rightArr[j];
            j++;
            k++;
        }
    }

    // 打印数组
    public static void printArray(int[] arr) {
        for (int num : arr) {
            System.out.print(num + " ");
        }
        System.out.println();
    }
}

说明:

  1. 归并排序的基本思路

    • 归并排序是一种"分治法"算法。它通过将一个大数组不断分成两半,直到每个子数组只有一个元素,然后再逐步将它们合并成一个有序数组。
    • 归并排序的关键是"合并"操作,它将两个已经排序的数组合并成一个新的排序数组。
  2. mergeSort():这是递归函数,首先将数组从中间分割成两半,然后对每半部分递归进行排序,最后合并这两个已经排序的部分。

  3. merge():负责合并两个已经排序的子数组。在合并过程中,通过比较左边数组和右边数组的元素,将较小的元素放入原数组中。若其中一边的数组先耗尽,则直接将另一边的剩余元素复制到原数组中。

  4. printArray():打印数组,便于展示排序前后的效果。

运行效果:

  • 程序会先打印出原数组,然后通过归并排序将其排序,再打印出排序后的数组。

归并排序的时间复杂度为 O(n log n),它是一种稳定的排序算法,适用于大数据集的排序。