java 實現二路歸併排序
阿新 • • 發佈:2018-12-23
歸併排序:是指將兩個或兩個以上有序的數列(或有序表),合併成一個仍然有序的數列(或有序表)
程式碼實現二路歸併排序如下:
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);
}
}