归并排序

这里讲的是归并排序的递归算法,非递归算法将在后续补充


归并我们采用分治的思想,

1.首先给出一个数组,我们可以将其一分为二;

2.对于两个子数组的我们也要对其进行排序然后将两个有序的数组合并;

3.将两个有序的数组合并在一起,时间复杂度为O(n);

4.对与两个子数组的处理我们可以回归到第一步,故可以采用递归的方式



不多说先上代码  :

<span style="font-family:KaiTi_GB2312;font-size:18px;">package sort;

import sortbasic.SortBase;

public class MergeSort extends SortBase {
	static Comparable[] aux;
	public static void sort(Comparable[] a,int begin,int end ){
		if(begin==end)return;
		int mid =(begin+end)/2;
		sort(a,begin,mid);
		sort(a,mid+1,end);
		merge(a,begin,mid,end);
	}
	private static void merge(Comparable[] a, int begin, int mid, int end) {
		int i=begin;
		int j=mid+1;
		for (int k = begin; k<end+1; k++) //将要归并的部分拷贝到辅助数组
			aux[k]=a[k];
		}
		for (int k = begin; k <end+1; k++) {//两个有序数组的合并 (值得细看)
			if(i>mid) 		a[k]=aux[j++];
			else if(j>end) 	a[k]=aux[i++];
			else 			a[k]=less(aux[i], aux[j])?aux[i++]:aux[j++];
		}
		
	}
	public static void main(String[] args) {
		Comparable[] a=generateArray(15);
		aux = new Integer[a.length];
		sort(a, 0, a.length-1);
		show(a);
		System.out.println(isSorted(a));
	}
	
}
</span>

result:

10 14 29 157 173 278 552 671 764 803 823 849 872 922 982
true


sort方法里面的步骤如下:

1.将数组一分为二

2.对左边数组使用归并排序

3.对右边数组使用归并排序

4.将左右数组合并(merge)


merge方法是归并排序中的难点,要注意的是:我们得借用辅助数组,因为左右数组的归并要借用辅助数组才能较好的完成

归并排序的时间复杂度:

一分为二分到底 时间复杂度为O(log n)

merge过程 时间复杂度为O(n)

故为O(nlog n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值