時間複雜度 o(n log n)空間複雜度 o(n)穩定性 穩定發明者 約翰·馮·諾伊曼 (就是那個計算機馮·諾伊曼體系的人)
歸併排序是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法(divide and conquer)的乙個非常典型的應用。
將已有序的子串行合併,得到完全有序的序列;即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。
**歸併排序【陣列】 **/
#include
#include
#include
#include
using
namespace
std;
//需要排序的陣列
int result[10]=;
int flag=0;//
列印陣列中的所有元素
void
print_arr()
//將兩個已經排序的陣列合併為乙個新的已經排序的陣列
void merge(int start, int medium, int
end)
else
}//把臨時存放的結果放到最終的結果陣列中去
for(int j=start;j<=end;j++)
flag++;
cout
<
次合併"
<
print_arr();}//
遞迴分解
void merge_sort(int start,int
end)
//只有兩個元素直接合併
if(start + 1 ==end)
int sum = end - start + 1
;
//分解成兩組
merge_sort(start,sum/2+start-1
); merge_sort(sum/2+start,end);
//合併
merge(start,sum/2+start-1
,end);
}int
main()
鍊錶的歸併
public對於歸併排序來說有一點是,這個排序演算法是穩定的,也就是相同的兩個數不會位置不會進行交換。class
mergetsortlist
listnode list2 =slow.next;
slow.next = null
; head =sortlist(head);
list2 =sortlist(list2);
return
merge(head, list2);
}private
static
listnode merge(listnode list1, listnode list2)
else
last =last.next;
}//最後剩餘的部分,直接連線起來即可
if(list1 != null) last.next =list1;
else
if(list2 != null) last.next =list2;
return
newhead.next;
}public
static
void
main(string args) }}
所以當需要穩定排序的時候就可以使用歸併。
還有就是當我們看見有兩個已經排序好的資料結構,我們可以考慮利用這種歸併的思想去解決這樣的問題。
排序演算法 歸併排序
歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。首先考慮下如何將將二個有序數列合併。這個非常簡單,只要從比較二個數列的第乙個數,誰小就先取誰,取了後就在對應數列中刪除這個數。然後再進行比較,如果有數列為空,那直接將另...
排序演算法 歸併排序
include include define status int define max 20 typedef struct elemtype typedef struct sqlist void inital sqlist l 初始化 bool lt int i,int j void merge ...
排序演算法 歸併排序
歸併排序的思想其實完全是分治法的思想的體現,它完全遵循分治法的模式。這裡有必要再重提下分治法的思想 將原有的問題分解為幾個規模較小的但類似於原問題的子問題,遞迴的求解這些子問題,然後再合併這些子問題的解來求得原問題的解。現在來看看歸併排序的操作 1 將等待排序的含有 n 個元素的序列分解成各具有 n...