歸併排序演算法是分治思想的典型應用,下面具體闡述該演算法。 演算法描述
歸併排序演算法是建立在歸併操作上的一種有效排序演算法,整體思路就是對於一個需要排序的數組A[0…n-1],歸併排序首先將它一分為二:A[0…,(n/2)-1]和A[n/2…,n-1],然後對每個子數組進行遞迴排序,最後將兩個排序好的子數組合并為一個有序數組。 演算法分析
演算法時間複雜度分析:
最好情況:O(nlogn);
最壞情況:O(nlogn);
平均情況:O(nlogn); 演算法Java代碼實現
import java.util.*;public class MergeSort { public int[] mergeSort(int[] A, int n) { // 對數組進行邊界條件判定 if(A==null||A.length==0){ return null; } sort(A,0,n-1); return A; } //遞迴排序階段 public void sort(int[] data,int left,int right){ //將數組拆分為兩部分,排序合并 if(left<right){ int middle = (left+right)/2; sort(data,left,middle); sort(data,middle+1,right); merge(data,left,middle,right); } } //兩個有序數組A,B的合并演算法 public void merge(int[] data,int left,int middle,int right){ //定義一個臨時數組,用於後期存放兩個待合并數組合并後的結果 int[] temp = new int[right-left+1]; //待合并數組A的指標,指向第一個元素 int leftIndex = left; //待合并數組B的指標,指向第一個元素 int rightIndex = middle+1; //臨時數組的指標 int tempIndex = 0; //迴圈比較兩個數組中元素的大小,並按照排序存放到臨時數組中去 while(leftIndex<=middle&&rightIndex<=right){ //依次比較兩個數組中各個元素的大小,將較小的放入臨時數組, if(data[leftIndex]<=data[rightIndex]){ temp[tempIndex++] = data[leftIndex++]; }else{ temp[tempIndex++] = data[rightIndex++]; } } //當一個數組中元素全部比較完成時,根據指標判斷另一個數組中是否還有未比較的元素,如果有,按照順序全部存放到臨時數組的已有元素的後面 while(leftIndex<=middle){ temp[tempIndex++] = data[leftIndex++]; } //當一個數組中元素全部比較完成時,根據指標判斷另一個數組中是否還有未比較的元素,如果有,按照順序全部存放到臨時數組的已有元素的後面 while(rightIndex<=right){ temp[tempIndex++] = data[rightIndex++]; } int temp1 = 0; //將臨時數組中的元素按照順序依次拷貝到原數組中去,完成一個合并排序 while((temp1+left)<=right){ data[temp1+left] = temp[temp1++]; } }}
merge方法分析:初始狀態下,定義兩個指標(待合并排序數組下標)分別指向兩個待合并數組的第一個元素,然後比較這兩個元素的大小,將較小的元素添加到新建立的臨時數組中去;接著,被複製數組中的指標向後移動一位,指向較小的元素的後繼元素,繼續上述比較過程,直至其中一個資料被處理完為止。然後,在未處理完的數組中,剩下的元素被複製到臨時數組的尾部,從而完成整個合并過程。