内部排序之归并排序
public class MergeSort {
/**
* 归并排序
* @param <T>
* @param a
* @param b临时数据
* @param start要排序数据起始地址
* @param end数据结束地址
*/
public static <T extends Comparable<? super T>> void merger(T [] a,T [] b,int start,int end){
if(start==end) return;
int middle=(start+end)/2;
//分成前后两部分后递归调用
merger(a, b,start,middle);
merger(a, b,middle+1,end);
//将排序好的前后两部分再排序
proccoss(a,b,start,middle+1,end);
}
/**
* 排序好的前后两部分再排序
* @param <T>
* @param a要排序的数据
* @param b临时数据组
* @param pos1要排序数据的起始地址
* @param pos2后半部分数据的起始地址(也是前一部分数据结束地址减1的位置)
* @param end后半部分数据的结束地址
*/
public static <T extends Comparable<? super T>> void proccoss(T [] a,T [] b,int pos1,int pos2,int end){
int bpos=pos1;
int tmp1=pos1;
int tmp2=pos2;
while(pos1<tmp2&&pos2<=end){
//将前后两部分中较小的数据放到临时数组相应的位置,同时对应的指针后移一位
if(a[pos1].compareTo(a[pos2])<0){
b[bpos++]=a[pos1++];
}else{
b[bpos++]=a[pos2++];
}
}
//如果其中的某一部分数据已经全部放到临时数字b中,那么将另一部分数据中剩余部分拷贝到临时数组中
if(pos1==tmp2){
for(int i=pos2;i<=end;i++){
b[bpos++]=a[pos2++];
}
}else{
for(int i=pos1;i<tmp2;i++){
b[bpos++]=a[pos1++];
}
}
//将临时数组中的数据拷贝回原数组
for(int i=tmp1;i<=end;i++){
a[i]=b[i];
}
}
public static void main(String[] args) {
Integer a []={8,6,9,2,5,100,25,48,1,6,8,46,7864,54,111};
merger(a,new Integer[a.length],0,a.length-1);
for(int i=0;i<a.length;i++){
System.out.print(a[i]+",");
}
}
}