归并排序:是指将两个或两个以上有序的数列(或有序表),合并成一个仍然有序的数列(或有序表)
代码实现二路归并排序如下:
public class MergeSort {
/*二路归并算法实现数组的排序*/
/*二路归并*/
public void MergeTwo(int array[],int low,int mid,int upper){
/*将有序序列array[low...mid]和有序序列array[mid+1...upper]合并成一个有序序列*/
/*将两个有序子序列合并,存放于一个临时数组中,合并完成后再复制回原序列数组中*/
int temp[]=new int[upper-low+1]; // 临时数组
int low1=low;
int low2=mid+1;
int pos=0;
while(low1<=mid && low2<=upper){//将两个子序列归并
temp[pos++]=(array[low1]<=array[low2])?array[low1++]:array[low2++];
}
/*将两个子序列尚未处理完的部分复制到temp中*/
while(low1<=mid){
temp[pos++]=array[low1++];
}
while(low2<=upper){
temp[pos++]=array[low2++];
}
/*归并完成,将temp中的元素复制回array中*/
for(pos=0,low1=low;low1<=upper;pos++,low1++){
array[low1]=temp[pos];
}
}
/*一趟归并排序*/
public void Merge(int array[],int len,int n){
/*将长度为len的序列两两归并,形成长度为n的序列*/
int i;
for( i=0;i+2*len-1<n;i=i+2*len){
MergeTwo(array,i,i+len-1,i+2*len-1);
}
if(i+len-1<n){ //对余下的两个子序列归并
MergeTwo(array,i,i+len-1,n-1);
}
/*输出每趟排序的结果*/
for(i=0;i<n;i++){
System.out.print(array[i]);
}
System.out.println();
}
/*二路归并排序*/
public void mergeSort(int array[],int n){
int i;
for(i=1;i<n;i=i*2){ /*需要做log2(n)次排序*/
Merge(array,i, n);
}
}
public static void main(String[] args) {
/*使用归并排序法进行排序*/
int array[]=new int[]{9,8,7,6,5,4,3,2,1}; //把待排序的数存放在数组中
int n=array.length;
MergeSort ms=new MergeSort();
ms.mergeSort(array,n);
}
}