歸併排序MergeSort的C實現

2021-09-13 03:18:47 字數 1031 閱讀 8343

歸併排序作為最經典的分治演算法之一,本質是利用遞迴把問題分解至最小子問題(即將原陣列分解為只有單個元素的子陣列),然後遞迴開始「回公升」,每一層回公升都是在合併兩個有序陣列(依次從兩個陣列的頭部取出較小的元素放入目標陣列,某一組全部取出後即可直接依次插入另一陣列的所有剩餘元素,兩組元素全部取完後排序結束),c語言**如下:

void merge(int arra, int lena, int arrb, int lenb, int arrtarget)  else 

}for (; ia < lena; ia ++, it ++) arrtarget[it] = arra[ia]; // 若陣列a還有剩餘元素

for (; ib < lenb; ib ++, it ++) arrtarget[it] = arra[ib]; // 若陣列b還有剩餘元素

}

完成了這個merge,其實就已經做完了歸併排序的大部分工作,接下來我們只要把前期準備做好就可以了!也就是merge接受的兩個輸入陣列必須是有序的,但是怎麼才能從亂序的原始陣列中得到兩個有序的子陣列呢?

這裡我們可以使用二分法,也就是將原始陣列從中點開始不斷往下分割,當每乙個子陣列都只包含乙個元素時,它也就達到了有序狀態。而這裡,自然也就是遞迴開始「回公升」的節點,merge也可以出現了。

於是整個排序的過程就是:不斷二分 -> 觸底(完全分割) -> 回公升

void mergesort(int arr, int fst, int lst, int arrtarget) 

}

執行結束後,arrtarget就是原陣列的有序版本,它可以在main函式中直接定義,不過也可以通過進一步打包函式來避免這種麻煩並減少需要填寫的引數:

int* mergesort(int arr, int len) 

mergesort(arr, 0, len - 1, arrtarget);

return arrtarget;

}

現在只需要填上原始陣列和長度就可以得到乙個排好序的新陣列的指標啦!

C 歸併排序(MergeSort)

一 思路 穩定排序 1 劃分 一直呼叫劃分過程,直到子串行為空或只有乙個元素為止,共需log2 n 2 歸併 將兩個子串行從小到大合併為乙個序列 二 實現程式 歸併排序 二路歸併 1 遞迴分解陣列 2 合併有序的序列 include using namespace std 合併兩個有序的序列 tem...

歸併排序 Merge sort

merge the a s.m and a m 1.t to r s.t template void two merge typet a,typet r,int s,int m,int t while i m r k a i while j t r k a j merge the a 0.n 1 s...

歸併排序(merge sort)

歸併排序 歸併排序是一種遞迴排序演算法,無論陣列元素的原始順序如何,其效能恆定不變。將陣列一分為二,分別排序兩部分元素,再將有序的兩半陣列歸併為乙個有序陣列。歸併步驟比較陣列前一半的元素與陣列的後一半元素,並將較小元素移到臨時陣列,該過程繼續前進,直到其中一半再沒有元素為止。此後只需將其餘元素移到臨...