C語言排序之歸併排序篇

2021-08-05 19:18:43 字數 1187 閱讀 6698

歸併排序是建立在歸併操作上的一種有效的排序演算法,效率為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的...