1. 程式人生 > >java 實現二路歸併排序

java 實現二路歸併排序

歸併排序:是指將兩個或兩個以上有序的數列(或有序表),合併成一個仍然有序的數列(或有序表)
程式碼實現二路歸併排序如下:

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