歸併排序(merge-sort)是利用歸併的思想實現的排序方法,該演算法採用經典的分治(divide-and-conquer)策略(分治法將問題分(divide)成一些小的問題然後遞迴求解,而治(conquer)的階段則將分的階段得到的各答案"修補"在一起,即分而治之)。
即將要排序的序列進行二分,然後對左右兩邊進行排序,最後進行合併,而二分的時候,不止一次二分,而是不斷分到最後只有乙個元素為止。圖示如下:
所以對於歸併排序主要有兩個函式:
1.把乙個陣列不斷的二分,不斷的自己呼叫遞迴(mergesort(int a,int s,int e,int b))
2.把二分後的陣列,最後根據排序(公升序或者降序)進行合併(merge(int a,int s,int m,int e,int b))
所以這是乙個不斷遞迴的處理,再二分的同時,對二分後的結果進行合併排序
/*
編寫人:mikchy
功能: 實現歸併排序,利用分治思想和遞迴
思路: 1.乙個陣列分成兩部分。
2.兩個部分實現分別再遞迴 歸併排序
3.然後將已經排好序的左右兩部分合併起來
時間複雜度: o(nlogn),需要多開銷乙個陣列,和要排序的陣列等長
*/ #include#includeusing namespace std;
int a[100010];
int b[100010];
void merge(int a,int s,int m,int e,int b)
while(p1<=m)
b[pb++] = a[p1++];
while(p2 <= e)
b[pb++] = a[p2++];
// 此時在 b 陣列中是排好序的,但是我們需要放回 a 陣列中
// 總的長度,e-s+1
// 而 a 的開頭是要 s ,結尾要是 e
for(int i = 0;i < e-s+1;i++)
a[s+i] = b[i];
}void mergesort(int a,int s,int e,int b) }
int main()
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...
歸併排序原理及C 原始碼實現
建立在歸併操作上的一種有效 穩定的演算法,採用分治法,先使每個子串行有序,然後將以有序的子串行合併,得到完全有序的序列。若將兩個有序表合成乙個有序表,成為二路歸併。排序思想,一分為二,二分為四,四分為八,直到劃分到最細 然後逐漸合併回去。分的時候採用遞迴的方式進行。先把原始序列進行分組,劃分為多個子...
排序演算法 歸併排序原理及Java實現
歸併排序就是利用歸併的思想實現的排序方法。而且充分利用了完全二叉樹的深度是 經過第一輪比較後得到最小的記錄,然後將該記錄的位置與第乙個記錄的位置交換 接著對不包括第乙個記錄以外的其他記錄進行第二次比較,得到最小記錄並與第二個位置記錄交換 重複該過程,知道進行比較的記錄只剩下乙個為止。一趟歸併需要將陣...