欢迎访问宙启技术站
智能推送

Java函数实现归并排序的完整步骤。

发布时间:2023-06-09 19:04:41

归并排序,是一种典型的基于分治思想和递归实现的排序算法。它的基本思想是将待排序的序列划分为若干个子序列,对每个子序列进行排序,然后将排好序的子序列合并,最终完成整个序列的排序。下面我们就来讲一讲如何用Java函数实现归并排序。

1. 实现归并函数

归并函数是归并排序的核心函数,它负责将两个有序子串合并成一个有序序列。具体实现如下:

public static int[] merge(int[] left, int[] right) {
    int[] result = new int[left.length + right.length];
    int i = 0, j = 0, k = 0;
    while (i < left.length && j < right.length) {
        result[k++] = left[i] < right[j] ? left[i++] : right[j++];
    }
    while (i < left.length) {
        result[k++] = left[i++];
    }
    while (j < right.length) {
        result[k++] = right[j++];
    }
    return result;
}

这个函数接收两个有序子数组left和right,返回它们合并成的有序数组result。在函数中,我们使用三个指针i、j和k来追踪left、right和result数组的位置,并依次比较left[i]和right[j]的大小关系,将较小值放入result[k]中。如果其中一个数组遍历完了,我们就直接将另一个数组的剩余元素复制到result数组中。

2. 实现分治函数

分治函数是主要函数,它首先将待排序的序列不断拆分,直到每个子序列只剩下一个元素,然后逐层进行归并操作,最终返回排序好的序列。具体实现如下:

public static int[] mergeSort(int[] arr) {
    if (arr.length <= 1) {
        return arr;
    }
    int mid = arr.length / 2;
    int[] left = new int[mid];
    int[] right = new int[arr.length - mid];
    for (int i = 0; i < mid; i++) {
        left[i] = arr[i];
    }
    for (int i = mid; i < arr.length; i++) {
        right[i - mid] = arr[i];
    }
    return merge(mergeSort(left), mergeSort(right));
}

这个函数接收待排序的数组arr,首先进行基线检查,如果它的长度小于等于1,直接返回它本身。否则,将数组拆分成长度为mid和arr.length-mid的left和right两个子数组,然后不断递归地调用mergeSort函数对left和right进行归并排序,最后返回合并后的结果。

3. 主函数测试

将merge和mergeSort函数放在一起,对一个随机生成的大小为10的数组进行排序:

public static void main(String[] args) {
    int[] arr = {5, 4, 2, 7, 8, 3, 1, 9, 6, 0};
    int[] sorted = mergeSort(arr);
    System.out.println(Arrays.toString(sorted));
}

输出结果:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

这表明我们成功地使用归并排序对数组进行了排序。

归并排序的时间复杂度为O(nlogn),它对数组的初始状态没有要求,稳定性好,所以在实际应用中广泛使用。