归并排序学习

将两个有序数组归并成大的有序数组

原地归并

//原地归并方法
         private static Comparable[] aux;//用来存放数组并作为参照实现排序
	public static void merge(Comparable[] a,int lo,int mid,int hi) {
		//将a[lo...mid]和a[mid...hi]归并
		int i=lo,j=mid+1;
		for (int k = lo; k <=hi; k++) {
			//a[k]复制到aux[k]
			 aux[k]=a[k];
		}
		for (int k = lo; k <=hi; k++) {
			//左半边用尽
			if (i>mid)   a[k]=aux[j++];
			//右半边用尽
			else if(j>hi) a[k]=aux[i++];
			//右半边小
			else if(aux[j].compareTo(aux[i])<0) a[k]=aux[j++];
			//左半边小
			else a[k]=aux[i++];
		}
	}
自顶向下的归并排序

基于原地归并的抽象实现的递归归并,实现了分治算法

对于长度为N的数组,自顶向下的归并排序需要0.5NlgN至NlgN次比较,最多需要访问数组6NlgN次

//自顶向下的归并排序
	public static void sort(Comparable[] a) {
		aux=new Comparable[a.length];
		sort(a,0,a.length-1);
	}
	private static void sort(Comparable[] a,int lo,int hi) {
		//将数组a[lo...hi]排序
		if (hi

自底向上的归并排序

对于长度为N的数组,自顶向下的归并排序需要0.5NlgN至NlgN次比较,最多需要访问数组6NlgN次

//自底向上的归并排序
	public static void sort1(Comparable[] a) {
		//进行lgN次的两两归并
		int N=a.length;
		aux=new Comparable[N];
		for (int sz=1 ; sz< N; sz=sz+sz) {//子数组大小
			for (int lo= 0; lo

当数组长度为2的幂时,两种比较次数和数组访问次数相同,顺序不同,

自底向上适合链表组织的数据

没有任何基于比较的算法能够保证少于lg(N!)-NlgN次比较将长度为N的数组排序。

你可能感兴趣的:(算法第四版)