归并排序理解


public class GBQuery {


    public static void fen(int[] arr, int L, int R) {
       
        if (L == R || arr.length == 0) {
            return;
        }

        //取数组的中间索引

        int mid = (L + R) / 2;
       //将数组分为长度为一的数组
        fen(arr, L, mid);
        fen(arr, mid + 1, R);

        //将L到mid的左边数组与mid+1到R的右边数组进行排序,这里可以理解为左右两边的数组已经排好序(长度为1时 )

        PaiXuL_R(arr, L, R, mid);

    }
    //此方法是对已经排好序的两个数组进行排序,(mid的左边包含mid)和右边(不包含mid)
    public static void PaiXuL_R(int[] arr, int L, int R, int mid) {

        //临时数组用来存储L-R的值(将两个有序数组进行排序后的值)
        int[] tem = new int[R - L + 1];
        int Li = L;
        int Ri = mid + 1;
        int TEMi = 0;

        //将两个数组中的较小的数放入临时数组
        while (Li <= mid && Ri <= R) {
            tem[TEMi++] = arr[Li] < arr[Ri] ? arr[Li++] : arr[Ri++];
        }
        //如果mid左边的值没有全部放如临时数组,将其全部放入(如果左边没有全部放入,那么右边一定完全放入,否则相反)
        while (Li <= mid) {
            tem[TEMi++] = arr[Li++];
        }
        //如果mid右边的值没有全部放如临时数组,将其全部放入
        while (Ri <= R) {
            tem[TEMi++] = arr[Ri++];
        }

        //将临时数组中的值放回原数组中
        for (int i = 0; i < tem.length; i++) {
            arr[L + i] = tem[i];
        }

    }

    public static int[] creatArr() {

        //生成长度随机的数组
        int[] arr = new int[(int) (Math.random() * 100)];

        for (int i = 0; i < arr.length; i++) {
            arr[i] = (int) (Math.random() * 100 - Math.random() * 59);
        }
        fen(arr, 0, arr.length - 1);
        return arr;
    }


    public static void main(String[] args) {

        int[] a = creatArr();
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i] + "  ");
        }


    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值