排序演算法 歸併排序

2021-07-11 16:00:47 字數 885 閱讀 5847



將n個數分成n/2組,排序好,再兩兩合併,分成n/4組,再依次上去,因為已經排序好了,合併起來很快。

每次需要對比的次數為n次

比如n=64時

當n/4時,每隊有4個數,總共有16組,第一隊的4個數與第二隊的4個數對比,需要最多8次。總共有8組(每組2對)需要對比,即對比64次,也就是n

即分解後都需要對比n次,那需要分解多少次呢?

64/2, 64/2/2, 64/2/2/2

就是需要分解log2^n次,64可以分解6次,2,4,8,16,32,64

所以歸併排序的複雜度為o(nlgn),演算法中log2#n(2為底)直接寫成lgn即可,底數一般不考慮,因為n很大時,底數已經不是英雄數目的關鍵了

歸併排序還有個好處,可以多執行緒分開執行,效率更高。

有點像平時打牌,左邊一堆已經排好序的,右邊已經排好序列,這兩堆要排序,只需要依次比較他們最小的值,最多比較n次就結束了。好的情況,第一堆比較完了,第二堆很快與"空"比較。

int sort_merge(int* ptr_data, int start_index, int mid_index, int stop_index)

ptr_data1[n1] = 65535; // 設定乙個最大的「空"值,這樣ptr_data2對比起來肯定比它小

for(i = 0; i < n2; ++i)

ptr_data2[n2] = 65535;

int data1_index = 0;

int data2_index = 0;

for(i = start_index; i < stop_index; ++i)

if (ptr_data1[data1_index] > ptr_data2[data2_index])

else}}

排序演算法 歸併排序

歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 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...