java实现的归并排序详解

归并排序的基本原理为:

一:拆分,假设有N个元素的列表,将这个列表拆分成2个或两个以上元素组成的新的列表,然后分别对子列表进行排序

二:归并,把所有的排好序的子类表两两归并,如此重复,直到归并成一个含N个有序列表为止

归并排序其实和快速排序都是同一种思想的排序算法,其采用的都是分治法的基本思想,即:将问题分解成一个个小的问题,分而治之。


public class Mergesort {

	/*
	 * leftPos左数组的第一个元素的下标
	 * leftEnd左数组的最后一个元素的下标
	 * rightPos右数组第一个元素的下标
	 * rightEnd 右数组最后一个元素的下标*/
	private static <Integer extends Comparable<? super Integer>> void meger(int []a,
			int[]tmpArray,int  leftPos,int rightPos,int rightEnd){
		int leftEnd = rightPos-1;
		int tmpPos = leftPos;
		int numElements = rightEnd - leftPos +1;
		//将两数组最最小的放入数组tmpArrray中
		while(leftPos<=leftEnd&&rightPos<=rightEnd){
			if(a[leftPos]-(a[rightPos])<=0){
				tmpArray[tmpPos++] = a[leftPos++];
			}else{
				tmpArray[tmpPos++]=a[rightPos++];
			}
		}
		//两数组中的另外一个数组的元素放入temArray中
		while(leftPos<=leftEnd){
			tmpArray[tmpPos++]=a[leftPos++];
		}
		while(rightPos<=rightEnd){
			tmpArray[tmpPos++]=a[rightPos++];
		}
		//将中间数组中的内容复制回原数组
		for(int i=0;i<numElements;i++,rightEnd--){
			a[rightEnd]=tmpArray[rightEnd];
		}
		for(int i = 0;i<tmpArray.length;i++){
			System.out.print(tmpArray[i]+",");
		}
		System.out.println();
	}
	/*
	 * left 待排数组的第一个元素的索引
	 * right 待排数组的最后一个元素的索引
	 * a 待排数组
	 * tmpArray 归并后的数组
	 * center左边数组的最后一个元素的下标 */
	private static <Integer extends Comparable <? super Integer>> void mergeSort(int[]a,
			int []tmpArray,int left,int right){
		if(left<right){
			int center =(left+right)/2;
			//对左边数组进行递归,在递归的过程中直到将左边数组拆分成元素为一的新的数组
			mergeSort(a,tmpArray,left,center);
			//对左边数组进行递归,在递归的过程中直到将右边数组拆分成元素为一的新的数组
			mergeSort(a,tmpArray,center+1,right);
			//合并数组
			meger(a,tmpArray,left,center+1,right);
		}
	}
	public static void main(String[] args) {
		Mergesort sort = new Mergesort();
		int num[]={5,7,3,8,1,4,9,2,6};
		int num2[] = new int[9];
		sort.mergeSort(num, num2, 0, num.length-1);
		for (int i = 0; i < num2.length; i++) {
			System.out.print(num2[i]+",");
		}
		System.out.println();
		for (int i = 0; i < num2.length; i++) {
			System.out.print(num[i]+",");
		}
	}
}
输出结果为:

每次数组合并之后的结果:

5,7,0,0,0,0,0,0,0, 
3,5,7,0,0,0,0,0,0, 
3,5,7,1,8,0,0,0,0, 
1,3,5,7,8,0,0,0,0, 
1,3,5,7,8,4,9,0,0, 
1,3,5,7,8,4,9,2,6, 
1,3,5,7,8,2,4,6,9, 
1,2,3,4,5,6,7,8,9,

所有数组合并完成之后的数组 1,2,3,4,5,6,7,8,9,

原有的数组排序之后: 1,2,3,4,5,6,7,8,9, 











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值