排序演算法之歸併排序

2021-08-28 11:55:09 字數 2049 閱讀 3708

歸併排序(mergesort)是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法(divide and conquer)的乙個非常典型的應用。 

分治法,也可以稱為分治策略:是將乙個大規模的問題(原問題)劃分成n個規模較小而結構與原問題相似的子問題,遞迴地解決這些子問題,然後再合併其結果,就得到原問題的解。

分治模式在每一層遞迴上都有三個步驟:分解、解決、合併。

簡單來說歸併排序類似於對兩個有序序列的合併。

將待排序元素序列分成兩個長度相等的子串行,對每乙個子串行排序,然後將他們合併成乙個序列,合併兩個子串行的過程稱為二路歸併。

**:1.分組

在這樣分組完畢之後,每個組內元素都只剩乙個,那麼乙個元素一定是有序的。這時候對相鄰的兩個元素進行歸併排序。兩兩排序完畢後再與其相鄰組繼續歸併,直至結束。       

2.歸併

void _mergesort(int arr, int beg, int end, int* tmp)// 分組

}void mergesort(int arr, int size)

_mergesort(arr,0,size,tmp);

free(tmp);

tmp = null;

}-----------------------------test.c----------------------------------

#include#include#include#includevoid test()

; int sz = sizeof(arr) / sizeof(arr[0]);

int i = 0;

mergesort(arr, sz);

for (; i < sz; i++) }

int main()

void mergedata(int arr, int beg, int mid, int end, int* tmp)

while (cur1 < mid)

while (cur2 < end) }

void mergesortnor(int arr, int size)

while (gap < size)

memcpy(arr, temp, size * sizeof(arr[0]));

gap <<= 1;

} free(temp);

temp = null;

}------------------------------------test.c-----------------------------------------

#include#include#include#includevoid test()

; int sz = sizeof(arr) / sizeof(arr[0]);

int i = 0;

mergesortnor(arr, sz);

for (; i < sz; i++) }

int main()

歸併排序演算法的穩定性:穩定歸併排序演算法的時間複雜度: o (n * log n)適用場景:在用於排序乙個整體無序但各個元素之間相對有序的序列時效率很高(外部排序)

排序演算法之歸併排序

歸併排序也是經典的使用分治法思想的代表演算法之一。歸併排序的效率很高,而且是一種穩定的排序。其總體的思想思路就是將待排序的元素分成大致相同的兩個子集合,分別對兩個子集合進行排序,最終將排序的子集合合併成排好序的總集合 歸併排序c 實現如下 include void mergesort int arr...

排序演算法之歸併排序

歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用,歸併排序將兩個已排序的表合併成乙個表。歸併排序基本原理 通過對若干個有序結點序列的歸併來實現排序。所謂歸併是指將若干個已排好序的部分合併成乙個有序的部分。歸併排序基本思...

排序演算法之歸併排序

歸併排序,和快排一樣同樣採用了分治的思想,將兩個 或以上 有序表合併成乙個新的有序表。歸併排序步驟如下 把n個記錄看成 n個長度為 1 的有序子表 進行兩兩歸併使記錄關鍵字有序,得到 n 2 個長度為 2 的有序子表 重複第2步直到所有記錄歸併成乙個長度為n的有序表為止。下面是歸併排序演算法的遞迴實...