排序演算法 歸併排序

2022-02-13 10:06:26 字數 1936 閱讀 3458

時間複雜度 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...