二路归并排序java版

这里是二路归并排序的二路归并算法:


package guibing;

public class GuiBingSort {

	/**
	* <pre>
	* 二路归并
	* 原理:将两个有序表合并和一个有序表
	* </pre>
	* 
	* @param a
	* @param s
	* 第一个有序表的起始下标
	* @param m
	* 第二个有序表的起始下标
	* @param t
	* 第二个有序表的结束小标
	* 
	 * @return 
	*/
  public static void main(String[] args) {

    int []a=new int[]{4,3,6,1,2,5};
    mergeSort(a,0,1);
    for(int i=0;i<a.length;++i){
    	System.out.println(a[i]+" ");
    	}
    
  }

private static void merge(int []a,int s,int m,int t){	
		int[] tmp = new int [t-s+1];
        int i=s,j=m,k=0;
       while((i<m)&&(j<=t)){
    	   	if(a[i]<=a[j]){
    	   		tmp[k]=a[i];
    	   		k++;
    	   		i++;
    	   	}else{
    	   		tmp[k]=a[j];
    	   		j++;
    	   		k++;
    	   	}
       }
       while(i<m){
    	   tmp[k]=a[i];
    	   i++;
    	   k++;
       }

       while(j<=t){
    	   tmp[k]=a[j];
    	   j++;
    	   k++;
       }
       System.arraycopy(tmp,0,a,s,tmp.length);
}

public static void mergeSort(int[]a,int s,int len){
	int size=a.length;
	int mid=size/(len<<1);
	int c=size&((len<<1)-1);
//-------归并到只剩一个有序集合的时候结束算法-------//
	if(mid==0)
		return;
//------进行一趟归并排序-------//
	for(int i=0;i<mid;++i){
		s=i*2*len;
		merge(a,s,s+len,(len<<1)+s-1);
}
//-------将剩下的数和倒数一个有序集合归并-------//
	if(c!=0)
		merge(a,size-c-2*len,size-c,size-1);
//-------递归执行下一趟归并排序------//
	mergeSort(a,0,2*len);
}
}

你可能感兴趣的:(java,eclipse,算法,实现,归并排序)