歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法(divide and conquer)的乙個非常典型的應用,歸併排序將兩個已排序的表合併成乙個表。
歸併排序基本原理
通過對若干個有序結點序列的歸併來實現排序。所謂歸併是指將若干個已排好序的部分合併成乙個有序的部分。
歸併排序基本思想
將待排序序列
r[0...n-1]
看成是n
個長度為
1的有序序列,將相鄰的有序表成對歸併得到
n/2個長度為
2的有序表
將這些有序序列再次歸併,得到
n/4個長度為
4的有序序列
如此反覆進行下去,最後得到乙個長度為
n的有序序列。
在具體的合併過程中,設定 i,j 和 p 三個指標,其初值分別指向這三個記錄區的起始位置。合併時依次比較 array[i] 和 array[j] 的關鍵字,取關鍵字較小(或較大)的記錄複製到 temp[p] 中,然後將被複製記錄的指標 i 或 j 加 1,以及指向複製位置的指標 p加 1。重複這一過程直至兩個輸入的子串行有乙個已全部複製完畢(不妨稱其為空),此時將另一非空的子串行中剩餘記錄依次複製到 array 中即可。
若將兩個有序表合併成乙個有序表,稱為2-路歸併
舉例說明"歸併排序的排序過程"
待排序列(14,12,15,13,11,16)
假設我們有乙個沒有排好序的序列,那麼首先我們使用分割的辦法將這個序列分割成乙個個已經排好序的子串行。然後再利用歸併的方法將乙個個的子串行合併成排序好的序列。分割和歸併的過程可以看下面的圖例。
先"分割"再"合併"
從上圖可以看出,我們首先把乙個未排序的序列從中間分割成2部分,再把2部分分成4部分,依次分割下去,直到分割成乙個乙個的資料,再把這些資料兩兩歸併到一起,使之有序,不停的歸併,最後成為乙個排好序的序列。
實現**:
#include#includetypedef int item;
#define key(a) (a)
#define less(a,b) (key(a)m;j--) aux[m+r-j+1]=a[j];
for(i=l,j=r,k=l;k<=r;k++) }
void mergesort(item a,int l,int r)
int main(int argc,char *argv)
{ int n=atoi(argv[1]);
item *a=(item*)malloc(n*sizeof(item));
for(int i=0;i
演算法基礎 歸併排序
1.演算法描述 把原始的陣列分成若干的子陣列,對每乙個子陣列進行排序 繼續把子陣列與子陣列合併,合併後仍然有序,直到全部合併完成,形成有序的陣列。2.演算法實現 2.1.合併子陣列 param unsorted the unsorted array param first the start ind...
演算法基礎 歸併排序
歸併排序即將目標陣列分成n個最小的組 相鄰的2個數字 並將這些最小子陣列排序,依次合併相鄰的子陣列,最後各自有序的子陣列將會合併成完全有序的陣列。這將需要用到遞迴思想。static class mergesort private static void merge int a,int start,i...
基礎演算法 歸併排序
def merge arr 這個函式是先把陣列進行分割,一直分,最後分成乙個數來呼叫第二個函式mergesort進行比較 如果陣列只有乙個數,直接就返回 if len arr 1 return arr mid len arr 2 left arr merge arr mid right arr me...