美文网首页
归并排序

归并排序

作者: zhaoyubetter | 来源:发表于2016-10-29 22:15 被阅读7次

归并排序是利用分治的思想,来解决排序问题;
分治法
将原问题分解成若干个规模较小但类似于原问题的子问题,递归的求解这些子问题,然后再合并这些子问题的解来建立原问题的解;

分解:分解待排序的n个元素的序列组成 n/2个元素的2个子序列;
解决:使用归并排序递归地排序2个子序列;
合并:合并2个已排序好的子序列,以产生已排序好的序列;
直到待排序序列长度为1时,递归“回升”;

关键操作是合并2个有序序列的过程:

实现代码(递归形式):

public static void main(String[] args) {
        int a[] = {-10, 20, 0, 3, 90, 5, 2, 1};
        mergeSort(a, 0, a.length - 1);
        System.out.println(Arrays.toString(a));

        System.out.println("===============");
        int b[] = {4, 1};
        merge(b, 0, 0, 1);
        System.out.println(Arrays.toString(b));
    }

    /**
     * 合并操作
     * 子数组:a[low, mid], a[mid+1,high] 都是有序的
     */
    public static void merge(int[] a, int low, int mid, int high) {
        int i = low;            // 第一段序列的下标
        int j = mid + 1;        // 第二段序列的下标
        int k = 0;            // 临时存放合并序列下标

        int[] ta = new int[high - low + 1];        // 临时合并序列
        // 扫描第一段与第二段
        while (i <= mid && j <= high) {
            if (a[i] <= a[j]) {
                ta[k] = a[i];
                i++;
            } else {
                ta[k] = a[j];
                j++;
            }
            k++;
        }

        // 收尾操作
        while (i <= mid) {
            ta[k] = a[i];
            i++;
            k++;
        }
        while (j <= high) {
            ta[k] = a[j];
            j++;
            k++;
        }

        // 将合并序列 复制到原始数组中
        for (k = 0, i = low; i <= high; i++, k++) {
            a[i] = ta[k];
        }
    }

    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);
        }
    }

输出:

Paste_Image.png

相关文章

  • 排序算法

    约定 选择排序 冒泡排序 插入排序 希尔排序 归并排序1. 归并方法2. 自顶向下归并排序3. 自底向上归并排序 ...

  • 排序二:归并、快排

    文章结构 归并排序 快速排序 源码 1. 归并排序 1.1 什么是归并排序 归并排序的思想是:将待排序的区间平分成...

  • java归并排序

    归并排序什么是归并排序:图解归并排序归并排序有两种实现方式,一是基于递归,而是基于迭代1)基于递归的归并排序: 基...

  • 算法—排序篇2

    1、归并排序(Merging Sort) 归并排序(Merging Sort): 就是利用归并的思想实现排序⽅法....

  • 常见的排序算法(2)

    要点 快速排序 归并排序 1.快速排序 2.归并排序

  • 排序算法之归并排序

    归并排序(Merge Sort) 归并排序是利用归并的思想实现排序的方式,该算法采用的是经典的分治算法 归并排序过...

  • 算法 第二章第二部分笔记

    各种排序算法的性能特点 选择排序 插入排序 希尔排序 归并排序 本地归并排序 自底向上的归并排序 快速排序 三向切...

  • 归并排序(二路归并排序)

    归并排序的思路 归并排序是通过“归并”操作完成排序的,将两个或者多个有序子表归并成一个子表。归并排序是“分治法”的...

  • 算法排序之归并排序和快速排序

    归并排序和快速排序用的都是分治的思想,用递归的编程技巧来实现.咱们先来看归并排序. 归并排序 归并排序的核心思想就...

  • 基于左闭右开的乱序数组归并排序 2020-04-24(未经允许,

    归并排序代码模板 递归形式思路:二分nums数组后对nums的归并排序 = 对左侧数组归并排序+对右侧数组归并排序...

网友评论

      本文标题:归并排序

      本文链接:https://www.haomeiwen.com/subject/bmmyuttx.html