歸併排序是建立在歸併操作上的一種有效的排序演算法,效率為o(nlogn),
1945
年由馮·
諾伊曼首次提出。
歸併排序的實現分為遞迴實現與非遞迴(迭代
)實現。遞迴實現的歸併排序是演算法設計中分治策略的典型應用,我們將乙個大問題分割成小問題分別解決,然後用所有小問題的答案來解決整個大問題。非遞迴(迭代
)實現的歸併排序首先進行是兩兩歸併,然後四四歸併,然後是八八歸併,一直下去直到歸併了整個陣列。
歸併排序演算法主要依賴歸併(merge)操作。歸併操作指的是將兩個已經排序的序列合併成乙個序列的操作,歸併操作步驟如下:
1. 申請空間
,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列
2. 設定兩個指標,最初位置分別為兩個已經排序序列的起始位置
3. 比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置
4. 重複步驟3直到某一指標到達序列尾
5. 將另一串行剩下的所有元素直接複製到合併序列尾。
#include
// 交換函式
void swap (int a, int i, int j)
// 列印陣列
void printa (int *a, int len)
printf ("\n");
}// a 是陣列 tmp 是緩衝區
void merge(int *a, int left, int mid, int right, int *tmp)
while (i <= mid)
tmp[k++] = a[i++];
while (j <= right)
tmp[k++] = a[j++];
k = 0;
for (i = left; i <= right; i++)
}void mergesort(int *a, int left, int right, int *tmp)
int main()
;int len = sizeof(a) / sizeof(a[0]);
int tmp[10];
mergesort (a, 0, len-1, tmp);
printa (a, len);
return 0;}
C語言排序演算法之歸併排序
排序演算法中的歸併排序 merge sort 是利用 歸併 技術來進行排序。歸併是指將若干個已排序的子檔案合併成乙個有序的檔案。設兩個有序的子檔案 相當於輸入堆 放在同一向量中相鄰的位置上 r low m r m 1 high 先將它們合併到乙個區域性的暫存向量r1 相當於輸出堆 中,待合併完成後將...
演算法篇之歸併排序
歸併排序是建立在歸併操作上採用分治法的一種排序演算法。將2個有序數列進行歸併操作。比較2數列第乙個數的大小,取小的放入合併數列並刪除該數,直至乙個數列為空,則將另一數列一次新增至合併數列。memeryarray int a,int b,int c while i a.length c k c i w...
歸併排序 C語言
今天寫的是歸併排序,歸併排序的定義為 依次將每兩個相鄰的有序表合併成乙個有序表的排序方法。最經常使用的歸併方法是2 路歸併。假設初始序列含有n個記錄,則可看成是n個有序的子串行,每個子串行的長度為1,然後兩兩歸併,得到 n 2 個長度為2或1的有序子串行 再兩兩歸併,如此重複,直至得到乙個長度為n的...