这里是二路归并排序的二路归并算法:
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);
}
}