博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
归并与归并排序
阅读量:6440 次
发布时间:2019-06-23

本文共 1565 字,大约阅读时间需要 5 分钟。

归并排序,同样是利用分治思想的典型算法例子,下面简单总结下归并排序。

一、归并的概念

  归并是这样一种概念,它针对两个或者多个有序的数组,是合并这多个有序数组并进行排序的一种手段,它的主要处理方法是每次都找出比较各个数组的首个元素(假设从左边开始排序而且是升序的方式),找出他们之间的最小值,将其拷贝到一个新的数组上,依次类推直到所有元素处理完,看说明图:

归并很好地利用了两个数组均是有序的这个条件,合并两个数组,大概只需要2n次比较即可(n是较小数组的长度),下面贴上归并的算法代码:

//归并方法    public static void mergeAB(int [] arrA,int [] arrB,int [] arrC){        //循环遍历两个需要归并的数组        for(int a=0,b=0,c=0;c<(arrA.length+arrB.length);){            //判断两个数组是否对应遍历完成            if(a==arrA.length){                //遍历完成A数组,则对应B中的元素只需要直接复制到C数组中                arrC[c++] = arrB[b++];                continue;            }            if(b==arrB.length){                arrC[c++] = arrA[a++];                continue;            }            //如果两个数组都没有遍历完,则进行比较操作            arrC[c++] = arrA[a]

二、归并排序

  归并排序是利用分治的思想进行递归归并的过程,递归过程不断对数组进行拆分,直到可以直接归并为止(可以认为是要处理的元素只有两个元素的时候,也可以认为是一个元素的时候)。其实理解了分治思想,归并排序理解起来还是挺简单的,下面简单贴上算法:

//归并排序方法    public static int [] guiBingSort(int [] arr,int l,int r){        //确定递归停止条件        if(l==r){            return new int[]{arr[r]};        }        //分两部分进行递归操作        int [] result1 = guiBingSort(arr, l, l+(r-l)/2);        int [] result2 = guiBingSort(arr, l+(r-l)/2+1, r);        //result1和result是已经排好序的数组,进行归并操作即可        int [] rtn = new int[result1.length + result2.length];        mergeAB(result1, result2, rtn);//调用归并方法        //返回归并结果        return rtn;            }

 

三、归并排序的特征

  归并排序大概有一下特征:

  1、它是稳定的排序算法,不改变元素之间的相对位置;

  2、归并排序的比较次数和元素的初始顺序无关,而且都是nlogn次;

  3、归并排序需要的内存空间是N的常数倍,所以它比较消耗内存空间。

本文转自 sshpp 51CTO博客,原文链接:http://blog.51cto.com/12902932/1926576,如需转载请自行联系原作者

你可能感兴趣的文章
类和元类
查看>>
Swift4 相机二维码扫描
查看>>
LeetCode之Jewels and Stones(Kotlin)
查看>>
钩子(hook)是啥
查看>>
iOS 仿系统指南针
查看>>
前端杂谈: DOM event 原理
查看>>
【iOS开发】打开另一个APP(URL Scheme与openURL)
查看>>
Dart4Flutter – 04 – 异步和库
查看>>
Hadoop笔记
查看>>
qca wlan wifi modules解析三
查看>>
Java Class文件结构实例分析(上)
查看>>
【译】Swift算法俱乐部-双端队列
查看>>
学习OpenGL ES之激光特效
查看>>
weex踩坑之image图片在ios/Android不显示
查看>>
文章整理
查看>>
MySQL实数类型使用注意事项
查看>>
GitText记录
查看>>
法力无边的stage-0
查看>>
Arouter原理分析
查看>>
[Android开发艺术探索阅读笔记]第9章 四大组件的工作过程
查看>>