本文實例講述了Java排序算法總結之歸併排序。分享給大家供大家參考。具體分析如下:
歸併操作(merge),也叫歸併算法,指的是將兩個已經排序的序列合併成一個序列的操作。和快速排序類似,讓我們一起來看,歸併在Java中的實現。
歸併排序(Merge)是將兩個(或兩個以上)有序表合併成一個新的有序表,即把待排序序列分為若干個子序列,每個子序列是有序的。然後再把有序子序列合併為整體有序序列。
歸併排序是建立在歸併操作上的一種有效的排序算法。該算法是採用分治法(Divide and Conquer)的一個非常典型的應用。 將已有序的子序列合併,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合併成一個有序表,稱為2-路歸併。
歸併排序算法穩定,數組需要O(n)的額外空間,鍊錶需要O(log(n))的額外空間,時間複雜度為O(nlog(n)),算法不是自適應的,不需要對數據的隨機讀取。
工作原理:
1、申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列
2、設定兩個指針,最初位置分別為兩個已經排序序列的起始位置
3、比較兩個指針所指向的元素,選擇相對小的元素放入到合併空間,並移動指針到下一位置
4、重複步驟3直到某一指針達到序列尾
5、將另一序列剩下的所有元素直接複製到合併序列尾
代碼實現:
////////////////public void mergeSort(){ long[] workSpace = new long[nElems]; recMergeSort(workSpace,0,nElems-1);}private void recMergeSort(long [] workSpace,int lowerBound,int upperBound){ if(lowerBound == upperBound){ return; } else{ int mid=(lowerBound+upperBound)/2; recMergeSort(workSpace, lowerBound, mid); recMergeSort(workSpace, mid+ 1, upperBound); merge(workSpace, lowerBound, mid+1, upperBound); }}private void merge(long[] workSpace,int lowPtr,int highPtr,int upperBound){ int j = 0; int lowerBound = lowPtr; int mid = highPtr - 1; int n = upperBound-lowerBound+1; while(lowPtr<=mid&&highPtr<=upperBound){ if(theArray[lowPtr]<theArray[highPtr]){ workSpace[j++]=theArray[lowPtr++]; } else{ workSpace[j++]=theArray[highPtr++]; } } while(lowPtr<=mid){ workSpace[j++] = theArray[lowPtr++]; } while(highPtr<=upperBound){ workSpace[j++] = theArray[highPtr++] ; } for(j=0;j<n;j++){ theArray[lowerBound+j]=workSpace[j]; }}
歸併排序是比較穩定的排序.即相等的元素的順序不會改變.如輸入記錄1(1) 3(2) 2(3) 2(4) 5(5) (括號中是記錄的關鍵字)時輸出的1(1) 2(3) 2(4) 3(2) 5(5) 中的2 和2 是按輸入的順序.這對要排序數據包含多個信息而要按其中的某一個信息排序,要求其它信息盡量按輸入的順序排列時很重要.這也是它比快速排序優勢的地方.
希望本文所述對大家的java程序設計有所幫助。