[CSDN21天学习挑战赛]归并排序(从merge到归并排序)


活动地址:CSDN21天学习挑战赛

一、merge

在归并排序之前,我们先了解merge过程
merge的原理是谁小拷贝谁
通过传入的中间下标m(mid)把数组划分成左右两部分,p1为左部分的开始坐标,p2为右部分的开始坐标,定义一个help数组,index为开始坐标
比较p1和p2的值,如果p1小则拷贝p1到help[index],反之拷贝p2,直到p1或者p2越界,再单独拷贝剩下的数,最后将help拷贝回原数组

在这里插入图片描述
谁小拷贝谁,拷贝1
在这里插入图片描述
拷贝2

在这里插入图片描述
谁小拷贝谁,直到把左边或者右边拷完,再单独拷贝一边

 public void merge(int[] nums,int l,int m,int r){
        if(l==r){
            return;
        }
        int[] help=new int[r-l+1];
        int p1=l;
        int p2=m+1;
        int index=0;
        //谁小拷贝谁
        while(p1<=m&&p2<=r){
            help[index++]=nums[p1]<=nums[p2]?nums[p1++]:nums[p2++];
        }
        while(p1<=m){
            help[index++]=nums[p1++];
        }
        while(p2<=r){
            help[index++]=nums[p2++];
        }
        for(int i=0;i<help.length;i++){
            nums[l+i]=help[i];
        }
    }

二、归并排序

知道了merge的步骤,那么我们就可以开始归并排序了
在递归的过程中,不断的把左右两部分排好序,最后将整体排序

	public static void mergeSort1(int[] arr) {
		if (arr == null || arr.length < 2) {
			return;
		}
		process(arr, 0, arr.length - 1);
	}
	public static void process(int[] arr, int L, int R) {
		if (L == R) {
			return;
		}
		int mid = L + ((R - L) >> 1);
		process(arr, L, mid);
		process(arr, mid + 1, R);
		merge(arr, L, mid, R);
	}
	
	 public void merge(int[] nums,int l,int m,int r){
        if(l==r){
            return;
        }
        int[] help=new int[r-l+1];
        int p1=l;
        int p2=m+1;
        int index=0;
        //谁小拷贝谁
        while(p1<=m&&p2<=r){
            help[index++]=nums[p1]<=nums[p2]?nums[p1++]:nums[p2++];
        }
        while(p1<=m){
            help[index++]=nums[p1++];
        }
        while(p2<=r){
            help[index++]=nums[p2++];
        }
        for(int i=0;i<help.length;i++){
            nums[l+i]=help[i];
        }
    }

关于归并的一些题目

剑指 Offer 51. 数组中的逆序对

327. 区间和的个数

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜菜的变强之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值