前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >二路归并排序的java实现

二路归并排序的java实现

作者头像
sanmutongzi
发布2020-03-04 15:41:05
8320
发布2020-03-04 15:41:05
举报
文章被收录于专栏:stream processstream process

转载请注明出处 http://www.cnblogs.com/dongxiao-yang/p/6410775.html

参考引言:在排序算法中快速排序的效率是非常高的,但是还有种排序算法的效率可以与之媲美,那就是归并排序;归并排序和快速排序有那么点异曲同工之妙,快速排序:是先把数组粗略的排序成两个子数组,然后递归再粗略分两个子数组,直到子数组里面只有一个元素,那么就自然排好序了,可以总结为先排序再递归;归并排序:先什么都不管,把数组分为两个子数组,一直递归把数组划分为两个子数组,直到数组里只有一个元素,这时候才开始排序,让两个数组间排好序,依次按照递归的返回来把两个数组进行排好序,到最后就可以把整个数组排好序;

代码语言:javascript
复制
public class mergesortutil {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        int[] a = new int[] { 11,9,7,5,3,1,12,10,8,6,4,2 };
        

        int[] tmp = new int[a.length];
        mergesort(a,0,a.length-1,tmp);
    }

    private static void mergearray(int[] array, int start, int middle, int end,int[] tmp) {

        int first = start;
        int second = middle + 1;
        int index = start;


        while ((first <= middle) && (second <= end)) {
            if (array[first] >= array[second])
                tmp[index++] = array[second++];
            else
                tmp[index++] = array[first++];
        }
        while (first <= middle)
            tmp[index++] = array[first++];
        while (second <= end)
            tmp[index++] = array[second++];

        for (first = start; first <= end; first++)
            array[first] = tmp[first];
        
        
        System.out.println("merge is "+Arrays.toString(array));

    }

    public static void mergesort(int[] array, int start, int end,int[] tmp) {

        if (start >= end)
            return;
        int middle = ((end + start) >> 1);
        mergesort(array, start, middle,tmp);// 递归划分左边的数组
        mergesort(array, middle + 1, end,tmp);// 递归划分右边的数组
        mergearray(array, start, middle, end,tmp);// 对有序的两个数组进行合并成一个有序的数组
    }

}

程序调试输出如下

<!-- p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco} -->

merge is [9, 11, 7, 5, 3, 1, 12, 10, 8, 6, 4, 2]

merge is [7, 9, 11, 5, 3, 1, 12, 10, 8, 6, 4, 2]

merge is [7, 9, 11, 3, 5, 1, 12, 10, 8, 6, 4, 2]

merge is [7, 9, 11, 1, 3, 5, 12, 10, 8, 6, 4, 2]

merge is [1, 3, 5, 7, 9, 11, 12, 10, 8, 6, 4, 2]

merge is [1, 3, 5, 7, 9, 11, 10, 12, 8, 6, 4, 2]

merge is [1, 3, 5, 7, 9, 11, 8, 10, 12, 6, 4, 2]

merge is [1, 3, 5, 7, 9, 11, 8, 10, 12, 4, 6, 2]

merge is [1, 3, 5, 7, 9, 11, 8, 10, 12, 2, 4, 6]

merge is [1, 3, 5, 7, 9, 11, 2, 4, 6, 8, 10, 12]

merge is [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

调试过程输出结果有助于更好的理解排序过程,整个排序在数组划分到最小长度后不断进行局部排序和局部合并排序,最终合并为全数组。

参考资料

1 归并排序的原理及时间复杂度

2 白话经典算法系列之五 归并排序的实现

3 排序算法之 归并排序 及其时间复杂度和空间复杂度

<!-- p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco} -->

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-02-17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档