您的位置:首页 > 编程语言 > Java开发

java 实现二路归并排序

2016-06-12 20:23 405 查看
归并排序:是指将两个或两个以上有序的数列(或有序表),合并成一个仍然有序的数列(或有序表)

代码实现二路归并排序如下:

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);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: