二路归并排序的Java实现

1、归并介绍

      归并排序是多次将两个或者两个以上的有序表合并为一个表。


   

public class MegerSort {


	private int[] pArrayofInts;
	public MegerSort(int[] pArrayofInts) {
		this.pArrayofInts=pArrayofInts;
	}


	public void doSort() {
		for(int pLength=1;pLength<pArrayofInts.length;pLength*=2)
			megerPass(pLength);
	}
	public void printArray(){
		for(int pIndex=0;pIndex<pArrayofInts.length;pIndex++){
			System.out.print(pArrayofInts[pIndex]+"、");
		}
	}
	
	private void megerPass(int pLength){
		int i=0;
		for(;i+2*pLength<pArrayofInts.length;i=i+2*pLength)//归并两个相邻的长度为length的子表
			meger(i, i+pLength-1, i+2*pLength-1);
		if(i+pLength-1<pArrayofInts.length){//余下两个子表,后者长度小于length
			meger(i, i+pLength-1, pArrayofInts.length-1);
		}
	}


	//如下是对2个表进行合并 pArrayofInts[low...mid]为第一段,[mid+1...high]为第二段

private void meger(int pLow,int pMid,int pHigh){int[] pTemp=new int[pHigh-pLow+1];int k=0,i=pLow,j=pMid+1;for(;k<pTemp.length&&i<=pMid&&j<=pHigh;k++){//第一段和第二段均为扫面完时循环pTemp[k]=(pArrayofInts[i]>pArrayofInts[j])?(pArrayofInts[j++]):(pArrayofInts[i++]);}for(;i<=pMid&&k<pTemp.length;k++,i++ ){//将第一段剩余的记录放入临时数组pTemp[k]=pArrayofInts[i];}for(;j<=pHigh&&k<pTemp.length;k++,j++){//将第二段剩余的记录放入临时的数组pTemp[k]=pArrayofInts[j];}for(int pTempIndex=0,pArrayIndex=pLow;pTempIndex<pTemp.length&&pArrayIndex<=pHigh;pTempIndex++,pArrayIndex++){//将临时数组赋值回pArrayofInts中pArrayofInts[pArrayIndex]=pTemp[pTempIndex];}}}



 Main函数如下 

public class Main {


	public static void main(String[] args) {
		int[] pArrayofInts = { 3, 5, 6, 22, 1, 0, 4 ,87,902,111};
		RadixSort pRadixSort = new RadixSort(pArrayofInts,1000);
		System.out.println("排序前:");
		pRadixSort.printArray();
		pRadixSort.doSort();
		System.out.println("排序后:");
		pRadixSort.printArray();
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值