建立在歸併操作上的一種有效、穩定的演算法,採用分治法,先使每個子串行有序,然後將以有序的子串行合併,得到完全有序的序列。若將兩個有序表合成乙個有序表,成為二路歸併。
排序思想,一分為二,二分為四,四分為八,直到劃分到最細;然後逐漸合併回去。分的時候採用遞迴的方式進行。
先把原始序列進行分組,劃分為多個子串行,對每個子串行進行排序,然後子串行之間再兩兩合併排序得到新的有序序列作為下一次合併的子序,然後再把新子串行合併….如此迴圈最後得到乙個有序的序列。
例項:對資料[1, 4, 2, 6, 7, 3, 5, 10, 9]進行歸併排序。
初始狀態:1, 4, 2, 6, 7, 3, 5, 10, 9
第一次分組:,,,,,歸併後得到,,,,
第二次分組:,,,歸併後得到,,
第三次分組:,,歸併後得到,
第四次分組:,歸併後得到[1,2,3,4,5,6,7,9,10]
拆分完成後,需要對拆分的資料進行排序,這時候歸併函式一共有5個引數
sort(int *data, int *temp, int start, int middle, int end); 這裡的臨時變數temp是用於在兩個排序好的集合中作為中間變數合成乙個集合。
void
merge
(int arr,
int*temp,
int start,
int middle,
int end)
else}/*
這裡表示的是幾集合2的數值已經先排序完成,集合1剩下有資料剩餘,
這個時候直接把集合1剩餘的資料直接插入到合集的後面,比如兩個集合,
集合1:1 3 8 9, 集合2:2 4 6 7,集合1和集合2的合集到1 2 3 4 6 7,
此時集合2內的資料已經合併完畢,集合1還有8 9 資料,這個時候直接追加到合集中即可
*/while
(i <= middle)
//與上while類似,只是這裡剩餘的是集合2的資料
while
(j<=end)
//把臨時變數中的數值拷貝到陣列中
for(i=start; i <=end; i++)}
//start,end引數均為數值的下標值
void
mergesort
(int arr,
int*temp,
int start,
int end)
}//呼叫函式
intmain()
;int temp[9]
=;int len=9;
mergesort
(arr, temp,
0, len-1)
;}
歸併排序 原始碼
讀周顏軍 王玉茹 關偉洲.資料結構 21世紀高等教育計算機規劃教材 p.216 人民郵電出版社.此書原始碼也是摘自此書 歸併 排序 merge sort 是 又一 類 不同 的 排序 方法。歸併 排序 的 基本 思想 將 已 有序 的 子 檔案 進行 合併,得到 完全 有序 的 檔案。合併 時 只要...
歸併排序原理講解及C 實現
歸併排序 merge sort 是利用歸併的思想實現的排序方法,該演算法採用經典的分治 divide and conquer 策略 分治法將問題分 divide 成一些小的問題然後遞迴求解,而治 conquer 的階段則將分的階段得到的各答案 修補 在一起,即分而治之 即將要排序的序列進行二分,然後...
Python 歸併排序 原理及實現
原理參考 實現 n 5 nums 3,1,2,4,5 def mergesort l,r if l r return 長度小於等於1,無需排序,返回 mid l r 1 mergesort l,mid mergesort mid 1,r tmp nums l r 1 用來暫時儲存 k,i,j 0,l...