归并排序的java实现

三个函数实现归并排序:

基本思路:每次把数组一分为二,分别排序,最后通过merge函数实现整个数组的排序。

具体思路我们通过代码来讲解:

第一个函数:

public static void mergeSort(int[] arr)
	{
		if(arr==null||arr.length<2)//传入空指针或者数组的长度小于二,直接返回。
			return ;
		process(arr,0,arr.length-1);//在process中数组排序。
	}

第二个函数:

public static void process(int[] arr,int l,int r)//利用process函数递归实现数组排序
	{
		if(l==r)//此时只传入一个元素,不用排序,可以直接返回,此时递归结束。
			return ;
		int mid=l+(r-l)/2;//mid代表此时数组的中间值
		process(arr,l,mid);//递归排序数组l到mid的部分
		process(arr,mid+1,r);//递归排序数组mid+1到r的部分
		merge(arr,l,mid,r);//执行到此函数时l到mid部分和mid+1到r部分都已有序
                           //此时需要实现merge函数使这两个部分有序的函数在函数整体上有序。
	}

第三个函数:

原理:此时数组的(l——m)部分通过process函数已经变得有序了,(m+1——r)部分也通过process函数变得有序了,那merge函数只需要开辟一个新的空间,通过两个指针来维护指向数组两个部分的最小值,不断地把两个指针指向的较小数放到开辟的新空间中,保证新空间有序,直到把这两个部分的数都放到新开辟的空间中,归并结束,数组有序。

图示:

 

public static void merge(int []arr,int l,int m,int r)
	{
        //merge函数实现数组l到m部分和m+1到r部分上的整体有序
		int[] help=new int[r-l+1];
		int i=0;
		int p1=l;
		int p2=m+1;
		while(p1<=m&&p2<=r)
		{
			help[i++]=arr[p1]<=arr[p2]?arr[p1++]:arr[p2++];
		}
		while(p1<=m)
			help[i++]=arr[p1++];
		while(p2<=r)
			help[i++]=arr[p2++];
		for(int i1=0;i1<help.length;i1++)
			arr[l+i1]=help[i1];
	}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值