二路归并2算法的java实现(普通方法)

这里是二路归并排序算法的普通实现:


package GB;
/**
 * 
 * @author YuYunTan(谭淇蔚)
 *这里是算法,归并排序,这是二路归并排序算法
 *分治策略的思想:
 *任一实例
 *I = (n,A[1],...,A[n])分成两个这样的实例
 *I1 = ([n/2],A[1],...,A([n/2]))和
 *I2 = ([n/2],A[[n/2]+1],...,A(n))
 *分别对每个集合单独排序,然后将已排序的两个序列归并成一个含n个元素的分好类的序列
 *
 *这种思想是典型的分治设计思想,归并排序也叫做分治合并排序
 *
 *算法如下:
 *procedure MERGESORT(low,high)
 *global A[1...n]
 *if(low < high)
 *  then mid = (low+high)/2;//求这个集合的分隔点
 *  {
 *     MERGESORT(low,mid);//将这个子集合排序
 *     MERGESORT(mid+1,high)//将另一个子集合排序
 *     MEREG(low,mid,high);
 *  }
 * end
 * 
 *  procedure MERGE(low,mid,high)
 *  global A[1..n]
 *     设置辅助数组B(low..high)
 *     h←low;i←low;j←mid+1 
 *    while  h≤mid  and   j≤high  do 
 *      { if  A[h]≤A[j]  then
 *          B[i] ←A[h];h←h+1
 *        else 
 *          B[i] ←A[j];j←j+1
 *        i←i+1
 *      }
 *     if   h>mid  then                //前部分已空
 *       for k←j  to high   do        //处理后部分剩余的元素
 *          B[i] ←A[k]
 *          i←i+1
 *      else 
 *        for k←h  to mid   do      //处理前部分剩余的元素
 *             B[i] ←A[k]
 *             i←i+1     
 *       A    ←  B             /* 将B数组的值赋给A数组  
 *
 *     end
 */
public class GuiBingSort {
 
	
	
	public static void main(String[] args) {
		int []A ={3,9,4,7,10,34,23,11,2,1};
		System.out.println("排序前的数组为:");
		print(A);
		MERGESORT(A,0,A.length-1);
		System.out.println("排序后的数组为:");
		print(A);
	}
	private static void print(int[] a) {
		// TODO 自动生成的方法存根
		for(int i=0;i<a.length;i++){
			System.out.print(a[i]+" ");
		}
		System.out.println("");
		
	}
	private static void MERGESORT(int[] A, int low, int high) {
		// TODO 自动生成的方法存根
		int mid;
		if(low < high){
			mid = (low+high)/2;
			MERGESORT(A,low, mid);//一个子集合排序			
			MERGESORT(A,mid+1, high);//另一个子集合排序
			MERGE(A,low,mid,high);//归并两个以排序的子集合
		}
		
	}

	private static void MERGE(int[] A, int low, int mid, int high) {
		// TODO 自动生成的方法存根
		
		int h=low;
		int i=low;
		int j=mid+1;
		int []B = new int [A.length];
		while((h<= mid)&&(j <= high)){
			
			if(A[h] <= A[j]){
				B[i] = A[h];
				h = h+1;
			}else{
				B[i]=A[j];
				j = j+1;
			}
			i++;
		}
		
		if(h>mid){//前面部分已经空了
			for(int k=j;k<=high;k++){
				B[i]=A[k];
				i++;
			}
		}else{//处理前部分剩余元素
			for(int k=h;k<=mid;k++){
				B[i]=A[k];
				i++;
			}
		}
		for(int p = low;p<=high;p++){
			A[p] = B[p];			
		}	
	}
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YuYunTan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值