归并排序

归并排序(merging sort)是利用“归并”技术来排序。“归并”是将两个或两个以上的有序表组合成一个新的有序表。

利用归并思想实现排序:假设 初始序列有n个记录,则可以看成是n 个有序的子序列,每个子序列的长度为2,然后两 两归并,......,如此重复,直到得到一个长度为n的有序的序列为止,这种排序方法称为2-路归并排序。

2-路归并排序中的归并算法的基本思路:

两个有序的子序列sr[low...m]和sr[m+1...high],先将他们合并到一个局部的暂存序列tr中,待合并完成后将tr中的有序序列复制到sr中。

合并过程:在合并的过程中设置I、j、k三个指针,分别指向sr[low...m]和sr[m+1...high],tr[0...high]这三个序列的起始位置。合并时依次比较sr[i]和sr[j]的值,取较小的值放到tr[k]中,然后将被复制的记录的指针i或j加1,将tr的指针k加1.

重复这一过程直至两个输入的子文件有一个已全部复制完毕(不妨称其为空),此时将另一非空的子文件中剩余记录依次复制到tr中即可。

合并的具体算法如下:

/**
	 * 归并算法:
	 * 将有序的sr[i..m]和sr[m+1..n]归并为有序的tr[i..n]
	 * @param sr待排序的序列
	 * @param tr归并后的有序序列
	 * @i,m表示sr的上下界
	 * */
	protected void merge(int[]sr,int[]tr,int i,int m,int n){
		int k,j;
		for(k=i,j=m+1;i<=m&&j<=n;++k){
			tr[k]=(sr[i]>sr[j]?sr[j++]:sr[i++]);
		}
		if(i<=m)System.arraycopy(sr, i, tr, k, m-i+1);
		if(j<=n)System.arraycopy(sr, j, tr, k, n-j+1);
		System.arraycopy(tr, i, sr, i, n-i+1);//将在tr中排好序的子序列复制到sr中
	}

2-路归并的递归实现法:

/**
	 * 将待排序的序列sr进行递归的划分,直到递归到子序列的长度为1为止
	 * 将递归的子序列进行归并操作
	 * */
	private void mSort(int[]sr,int[]tr,int s,int t){
		if(s==t)tr[s]=sr[s];
		else{
			int m=(s+t)/2;	//将sr[s..t]平分为sr[s..m]和sr[m+1..t]
			mSort(sr,tr,s,m);	//依次递归的将s..m之间的序列进行平分,当m=0时递归停止,然后反推
			mSort(sr,tr,m+1,t);
			this.merge(sr, tr, s, m, t);
		}
	}





利用初始

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值