歸併排序法(merge sort,以下簡稱ms)是分治法思想運用的乙個典範。其主要演算法操作可以分為以下步驟:
step 1:將n個元素分成兩個含n/2元素的子串行
step 2:用ms將兩個子串行遞迴排序(最後可以將整個原序列分解成n個子序列)
step 3:合併兩個已排序好的序列
易知,ms的關鍵在於merge過程。對於這一過程的理解,演算法導論中給出了乙個形象的模型。
即假設桌面上有兩堆已排序好的的牌,且每一堆都正面朝下放置。然後我們分別從兩堆牌中選取頂上的一張牌(選取之後,堆頂端又會露出新的頂牌),選取較小的一張,放入輸出堆,另一張放回。
重複這一步驟,最後直到一堆牌為空。由於兩堆牌都是已排序,所以可知,只要將剩下的那堆牌蓋到輸出堆即完成整個排序過程。
public
int mergesort(int a, int n)
public
void
sort(int data, int left, int right)
}// 合併左右兩個子陣列
public
void
merge(int data, int left, int middle, int right) else
}// 剩餘的直接放入
while (leftindex <= middle)
// 剩餘的直接放入
while (rightindex <= right)
// 將臨時陣列放回原陣列相應位置
int temp = 0;
while ((temp + left) <= right)
}
歸併排序的效率是比較高的,設數列長為n,將數列分開成小數列一共要logn步,每步都是乙個合併有序數列的過程,時間複雜度可以記為o(n),故一共為o(n*logn)。因為歸併排序每次都是在相鄰的資料中進行操作,所以歸併排序在o(n*logn)的幾種排序方法(快速排序,歸併排序,希爾排序,堆排序)也是效率比較高的 歸併排序 Java實現
歸併排序 mergesort 1 思想 多次將兩個或兩個以上的有序表合併成乙個新的有序表。2 演算法時間複雜度 最好的情況下 一趟歸併需要n次,總共需要logn次,因此為o n logn 最壞的情況下,接近於平均情況下,為o n logn 說明 對長度為n的檔案,需進行logn 趟二路歸併,每趟歸併...
Java實現歸併排序
剛開始接觸歸併排序的時候,感覺挺困難的,但是仔細的分析之後,就會發現它的原理還是蠻簡單的 就是借助另外的乙個陣列空間將左右兩側 從中間mid處劃分 已經排序好的原陣列轉到新的陣列空間。如下圖所示 轉移操作時,就是左右所指的資料進行比較,將較小的資料 由小到大排序 儲存到新的陣列空間。如下圖所示 了解...
Java實現歸併排序
思想就是 將陣列分成兩個陣列,如果兩個陣列的元素都是有序的,那麼就可以很方便的將這兩組資料歸併。如果沒有序繼續將兩組陣列分組,以此類推,當組內只有乙個資料時,認為這個小組內已經有序,然後合併相鄰兩個小組就可以。package sort 歸併排序 2015 05 31 public class mer...