美文网首页
排序-归并

排序-归并

作者: sjandroid | 来源:发表于2018-07-11 17:25 被阅读0次

今天记录下关于:归并排序一些理解和心得。
主要分为以下几个方面分享

  • 归并排序的思想
  • 实现方式
  • 时间复杂度
  • 应用

归并排序的思想


实现方式

    public static void main(String[] args){
        Integer[] array = Util.createRandomArray(1000, 30);
        Integer[] array2 = Arrays.copyOf(array, array.length);
        Integer[] array3 = Arrays.copyOf(array, array.length);

        //调用Arrays.sort()
        Util.sysSort(array2);
        Util.print(array2, "Arrays.sort--");

        System.out.println("--------------------------------------------------------------------");

        //归并排序
        Integer[] result = mergeSort(array3);
        Util.print(result, " Merge Sort--");
    }

    public static Integer[] mergeSort(Integer[] array){
        //FIXME 要点
        //先排序
        //再合并

        if(array == null || array.length == 1){
            return array;
        }

        Integer[] result;

        //退出条件
        int length = array.length;
        if(length == 1){
            result = array;

        } else if(length == 2){
            swap(0, 1, array);
            result = array;

        } else {
            Integer[] left = new Integer[array.length >> 1];
            Integer[] right = new Integer[array.length - left.length];
            System.arraycopy(array, 0, left, 0, left.length);
            System.arraycopy(array, left.length, right, 0, right.length);

            left = mergeSort(left);
            right = mergeSort(right);

            result = merge(left, right);
        }

        return result;
    }

    private static Integer[] merge(Integer[] left, Integer[] right){
        Integer[] result = new Integer[left.length + right.length];

        int leftIndex = 0;
        int rightIndex = 0;
        int resultIndex = 0;
        while(leftIndex < left.length && rightIndex < right.length){
            Integer temp;

            if(left[leftIndex] < right[rightIndex]){
                temp = left[leftIndex++];
            } else {
                temp = right[rightIndex++];
            }

            result[resultIndex++] = temp;
        }

        while(leftIndex < left.length){
            result[resultIndex++] = left[leftIndex++];
        }

        while(rightIndex < right.length){
            result[resultIndex++] = right[rightIndex++];
        }

        return result;
    }

    private static void swap(int left, int right, Integer[] array){
        if(array[left] <= array[right]){
            return;
        }

        int temp = array[left];
        array[left] = array[right];
        array[right] = temp;
    }

log

Arrays.sort--:53---63---119---127---133---192---222---242---328---328---428---511---598---607---618---640---656---667---675---695---700---701---730---794---812---825---842---872---896---921
--------------------------------------------------------------------
 Merge Sort--:53---63---119---127---133---192---222---242---328---328---428---511---598---607---618---640---656---667---675---695---700---701---730---794---812---825---842---872---896---921


时间复杂度


应用


相关文章

  • 排序算法

    约定 选择排序 冒泡排序 插入排序 希尔排序 归并排序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/hozhpftx.html