归并排序

1. 基本定义

归并排序 (merge sort) 是一类与插入排序、交换排序、选择排序不同的另一种排序方法。归并的含义是将两个或两个以上的有序表合并成一个新的有序表。归并排序有多路归并排序、两路归并排序 , 可用于内排序,也可以用于外排序。这里仅对内排序的两路归并方法进行讨论。

  • 特点: 内存占用高,但是稳定。
    充分利用二分法的思想,利用了完全二叉树 深度是log2n + 1的特性,因此效率比较高

  • 基本原理: 对于给定的一组记录,利用递归与分治算法将数据序列划分成为越来越小的半子表,在对半子表排序, 最后再用递归方法将排好序的半子表合并成为越来越大的有序序列。

  • 过程:先拆分 再聚合

  • 时间复杂度: O(nlog2n)

  • 空间复杂度: O(n)


    image.png
  1. 代码实现
 public static void main(String[] args) {
        int a[] = { 12, 14, 15, 13, 11, 16 };
        mergeSort(a, 0, a.length - 1);
        System.out.println("排序结果:" + Arrays.toString(a));
    }
    public static void mergeSort(int[] a, int low, int high) {
        int mid = (low + high) / 2;
        if (low < high) {
            // 左边
            mergeSort(a, low, mid);
            // 右边
            mergeSort(a, mid + 1, high);
            // 左右归并
            merge(a, low, mid, high);
            System.out.println(Arrays.toString(a));
        }
    }
    public static void merge(int[] a, int low, int mid, int high) {
        int[] temp = new int[high - low + 1];
        int i = low;// 左指针
        int j = mid + 1;// 右指针
        int k = 0;
        // 把较小的数先移到新数组中
        while (i <= mid && j <= high) {
            if (a[i] < a[j]) {
                temp[k++] = a[i++];
            } else {
                temp[k++] = a[j++];
            }
        }
        // 把左边剩余的数移入数组
        while (i <= mid) {
            temp[k++] = a[i++];
        }
        // 把右边边剩余的数移入数组
        while (j <= high) {
            temp[k++] = a[j++];
        }
        // 把新数组中的数覆盖nums数组
        for (int k2 = 0; k2 < temp.length; k2++) {
            a[k2 + low] = temp[k2];
        }
    }

参考这篇文章,写的很好
https://www.cnblogs.com/chengxiao/p/6194356.html

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 归并排序 所谓归并,就是将两个或两个以上的有序表合并成一个新的有序表。如下图所示,有两个已经排好序的有序表A[1]...
    JackChen1024阅读 2,386评论 0 4
  • 利用递归与分治技术将数据序列划分成越来越小的半子表,在对半子表排序,最后再用递归方法将排好序的半子表合并成越来越大...
    聪明的奇瑞阅读 703评论 0 3
  • 引用来自 白话经典算法系列 推荐博客: Robin's Space 归并排序是利用递归和分而治之的技术将数据序列划...
    BeijingIamback阅读 404评论 0 0
  • 一. 概念 归并的含义是将两个或两个以上的有序表合并成一个新的有序表。大体分成,两路归并排序,和多路归并排序。用于...
    丶阿颜阅读 3,421评论 0 11
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 7,594评论 16 22