归并与归并排序

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

一、归并的概念

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

归并很好地利用了两个数组均是有序的这个条件,合并两个数组,大概只需要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]<arrB[b]?arrA[a++]:arrB[b++]; } }
复制代码

二、归并排序

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

复制代码
//归并排序方法
    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; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值