2021java实现归并排序 含递归和非递归(直接复制可用)

这篇博客介绍了如何使用Java实现归并排序,包括递归和非递归两种方式。递归方法通过不断划分数组并合并排序,非递归方法则采用自底向上的方式逐步合并已排序的子数组。博主提供了详细的代码实现,并指出在合并过程中需要注意边界条件的处理。
摘要由CSDN通过智能技术生成

所有的介绍也都在代码里
希望帮助到大家

import java.util.Arrays;
//采用递归来实现归并排序
public class mesort {

    public static void main(String[] args) {
        int [] m={1,34,5,2,55,66};

       mesort.sort2(m);
        for (int value : m) {
            System.out.println(value);
        }

    }

    private mesort(){}
    public static void sort(int []arr){
    sort(arr,0,arr.length-1);
    }
    public static void sort(int[]arr,int l,int r){
        //此方法实现的是把数组的从l到r的排序
        if(l>=r)
            return;
        int mid=(l+r)/2;
        sort(arr,l,mid);
        sort(arr,mid+1,r);
        merge(arr,l,mid,r);
    }

    public static void merge(int []arr,int l,int mid,int r ) {
        //合并两个数组的方法
        int[] team = Arrays.copyOfRange(arr, l, r + 1);
        //先将一个本数组进行拷贝  为什么是r+1呢 因为这个方法右边是不包括的,所以要加1
        //在拷贝的数组中进行操作 把操作后得到的值给原数组
        int i = l;
        int j = mid + 1;
        //下面就是比较了 用前半个数组来和后半个数组进行比较 前面从i开始 后面从j开始
        //只要i到了中间以后 j到了r以后 直接就结束了 将比较后的值来传给原来的数组
        for (int k = l; k <=r; k++) {
            if (i > mid) {
                arr[k] = team[j - l];
                j++;
            }
            else if (j > r) {
                arr[k] = team[i - l];
                i++;
            }
            else if (team[i-l] > team[j-l]) {
                arr[k] = team[j - l];
                j++;
            } else if(team[i-l] <team[j-l]){
                arr[k] = team[i - l];
                i++;
            }
        }
        }
        //这个方法是采用非递归的方式来实现归并排序的
    //基本就是采用自底向上的方式来实现,先把数组两两配对,实现排序 然后慢慢扩大数组的排序组数
    //2个配对 4个 8个 直到排序完成
    public static void sort2(int[]arr){
        int n= arr.length;
        for(int size=1;size<n;size+=size){
            for(int i=0;i+size<n;i+=size+size){
                //合并i i+size-1和i+size  i+size+size-1
                //前面这句话据说i到i+size但是不包括i+size这个值
                merge(arr,i,i+size-1,Math.min(i+size+size-1,n-1));
                //为什么要用math这个方法呢 因为 可能i+size+size-1这个值已经出界了
                // 但是n-1是一定没有出界的

            }
        }



    }
    }


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值