归并排序java实现

1.归并排序

归并排序是分治思想(divide-and-conquer)的经典运用。分治是先将现有问题分(divide)成一些小问题去递归求解,然后再将所有分的问题进行治理(conquer)合并得到最终结果。

下图来自参考文献1,该图就很清晰描述了归并排序的全过程。
在这里插入图片描述

2.归并排序java代码实现

public class MergeSort {

    public static void merge(int[] arr, int left, int mid, int right, int [] tmp) {
        int i = left;
        int j = mid + 1;
        int k = 0;
        while (i <= mid && j <= right) {
            if (arr[i] < arr[j]) {
                tmp[k++] = arr[i++];
            } else {
                tmp[k++] = arr[j++];
            }
        }
        while (i <= mid) {
            tmp[k++] = arr[i++];
        }
        while (j <= right) {
            tmp[k++] = arr[j++];
        }
        // 注意原始数组下标是从left开始,临时数组下标从0开始
        k = 0;
        while (left <= right) {
            arr[left++] = tmp[k++];
        }
    }

    public static void mergeSort(int[] arr, int left, int right, int[] tmp) {
        if (left < right) {
            int mid = (left + right) / 2;
            mergeSort(arr, left, mid, tmp);
            mergeSort(arr, mid + 1, right, tmp);
            merge(arr, left, mid, right, tmp);
        }
    }

    public static void main(String[] args) {
        int[] arr = {1, 3, 6, 2, 5, 4};
        mergeSort(arr, 0, arr.length - 1, new int[arr.length]);
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
    }
}

3.小结

1.归并排序利用了完全二叉树的性质,最好最坏与平均时间复杂度均为O(nlogn)。
2.归并排序是一种稳定排序算法。

4.外部归并排序

前面介绍的排序算法,都是内部排序算法,即排序都是在内存中完成的。如果待排序的数据量太大,内存中无法一次性装载所有数据,这个时候就需要使用到外部排序算法,常见的即为外部归并排序。

常见的步骤为:
1.根据内存大小,将待排序的大数据量平均分为n份,其中每份数据量均小于可用内存。依次将每份数据读入内存并排序,将排序完毕的数据存入外部存储系统比如磁盘,为下一份数据腾出内存空间进行排序。
2.对n份小数据进行合并,最终得到一个整体有序的大文件。

参考文献

1.https://www.cnblogs.com/chengxiao/p/6194356.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值