排序算法之归并排序

时间:2022-07-28
本文章向大家介绍排序算法之归并排序,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

归并排序

归并排序是一种非常优秀的排序算法,时间复杂度仅为O(nlogn),与选择排序和冒泡排序的O(n2)相比较,只是将n这个因子替换成了logn,但这是非常划算的一个交易。但归并排序也有些不足,因为归并排序不是原址的,它必须将整个输入数组进行完全的拷贝,如果空间非常宝贵的话,不推荐使用归并排序。

先上代码吧

public class 归并排序 {
    public static void main(String[] args) {
        int[] t = {9, 5, 6, 1, 3, 2, 0, 19, 45, 30};
        sort(t, 0, t.length - 1);
    }

    public static void sort(int[] arr, int left, int right) {
        if (left == right) {
            return;
        }
        int mid = (left + right) >>> 1;
        sort(arr, left, mid);
        sort(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 index=0;
        int p1=left;
        int p2 = mid + 1;
        while (p1 <= mid && p2 <= right) {
            temp[index++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];
        }
        while (p1 <= mid) {
            temp[index++] = arr[p1++];
        }
        while (p2 <= right) {
            temp[index++] = arr[p2++];
        }
        for (int i = 0; i < temp.length; i++) {
            arr[left + i] = temp[i];
        }
    }
}

归并排序采用了分治法。

在分治法中,我们将原问题分解为类似于原问题的子问题,并递归的求解这些子问题,然后再合并这些子问题的解来得出原问题的解。

当数组中只有一个元素时,此时数组一定是有序的,这是递归的基础情况。

下面来一组图片,更直观清晰的了解分解和合并的过程

动图演示

在归并排序上花费的比较久,因为发现自己对java的参数传递学习的还不够深入,所以又看了一遍java的参数传递。总的来说还不错,不仅掌握了一种新的排序算法,还加深了自己对java知识的了解。

随机文章