归并算法 (按思想实现,效率不高)

一. 算法描述

    自底向上的归并排序:归并排序主要是完成将若干个有序子序列合并成一个完整的有序子序列;自底向上的排序是归并排序的一种实现方式,将一个无序的N长数组切个成N个有序子序列,然后再两两合并,然后再将合并后的N/2(或者N/2 + 1)个子序列继续进行两两合并,以此类推得到一个完整的有序数组。下图详细的分解了自底向上的合并算法的实现过程:

归并算法 (按思想实现,效率不高)_第1张图片


二. 算法分析

平均时间复杂度:O(nlog2n)

空间复杂度:O(n)  (用于存储有序子序列合并后有序序列)

稳定性:稳定

三. 算法实现


package arithmetic.Merger;

public class Merger{
	
	public static int[] merger(int a[],int l,int r){
		int lArray[] = null,rArray[] = null;
		if(l==r){ // 拆分后有一组只有一个元素
			lArray = new int[1];
			lArray[0] = a[l];
			rArray = null;
		}else{
			 lArray = new int[(r-l+1)/2];
			 rArray = new int[(r-l+1)/2];
			if(l+1==r){ // 拆到最后有一组只有两个元素
				lArray[0] = a[l];
				rArray[0] = a[r];
			}else{ // 元素大于2
				int middle = (l+r)/2; //得到中间数
				lArray=merger(a,l,middle); //拆分左边的数组
				rArray=merger(a,middle+1,r); //拆分右边的数组
			} 
		}
		 return mergerTwoArray(lArray,rArray); //将左右两边的数组按从小打到合并
	}
	
	public static int[] merger(int a[]){
		  return merger(a,0,a.length-1);
	}
	
	/*
	 * 合并两个数组
	 * */
	public static int[] mergerTwoArray(int a[],int b[]){
		if(b==null) return a;
		int[] tempArray = new int[a.length + b.length];
		int aIndex =  0 , bIndex = 0,tempIndex = 0;
		while(tempIndex != tempArray.length){
			if(aIndex < a.length && bIndex < b.length){
				if(a[aIndex] <= b[bIndex]){
					tempArray[tempIndex] = a[aIndex];
					aIndex++;
				}else if(b[bIndex] < a[aIndex]){
					tempArray[tempIndex] = b[bIndex];
					bIndex++;
				}
			}else{
				if(aIndex != a.length){
					tempArray[tempIndex] = a[aIndex];
					aIndex++;
				}else if(bIndex != b.length){
					tempArray[tempIndex] = b[bIndex];
					bIndex++;
				}
			}
			tempIndex ++;
		}
		return tempArray;
	} 
	
	
	public static void main(String args[]){
		int a[] =  {9,132,33,44,88,19,19,23};
		int b[] =Merger.merger(a);
		for(int i = 0 ; i < b.length ;i++){
			System.out.print(b[i] + " ");
		}
	
	}
}

4 输出结果

9 19 19 23 33 44 88 132 

你可能感兴趣的:(归并算法 (按思想实现,效率不高))