当前位置:   article > 正文

归并排序java实现_java实现归并排序

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] + " ");
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

3.小结

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

4.外部归并排序

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

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

参考文献

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/67015
推荐阅读
相关标签
  

闽ICP备14008679号