k路歸併排序

2021-06-16 17:52:47 字數 715 閱讀 7791

題目:給定k個已序鍊錶,要求盡可能快的將這k個鍊錶合併為乙個有序鍊錶。

方案1:

將這k個鍊錶標號為1,2,...,k,對於這k個鍊錶,我們首先合併鍊錶1和鍊錶2,得到乙個有序的鍊錶l12,然後將l12和鍊錶3進行合併...直到k個鍊錶均合併完成,最終便能夠得到有序的鍊錶l1k,即為這k個鍊錶合併後的有序鍊錶。對於這種思路,可以寫出如下的c++**:

linklist mergelist(linklist l1, linklist l2)

else

}return ret;

}linklist mergesortlinklist(linklist *p, int k)

return finallist;

}

方案2:

利用乙個大小為k的最小堆作為輔助。步驟如下:

1.將k個鍊錶的第乙個元素建立乙個大小為k的最小堆,複雜度為o(k);

2.從堆中提取最小的那個節點min插入最終鍊錶尾部,複雜度為o(lgk);

3.若min->next不為空,則將其插入堆中,並重新調整堆,複雜度為o(lgk);

4.若堆不為空,則迴圈進入第2步,否則合併完成

由於對於這k個鍊錶中的每乙個元素,要使其插入最終鍊錶的正確位置,都需要經歷乙個插入堆和從堆中刪除的操作。所以整個演算法的複雜度為o(n*2lgk)+o(k)=o(nlgk).根據這種思路則不難實現其**了。

歸併排序(2 路歸併排序)

遞迴寫法 include define maxn 100 void merge int a,int l1,int r1,int l2,int r2 將陣列a的區間 l1,r1 和區間 l2,r2 合併為乙個有序區間 else while i r1 while j r2 for int i 0 i非遞...

2 路歸併排序

歸併排序的時間複雜度為o nlog2n 利用二路歸併排序時,需要利用與待排序序列長度相同的陣列作為臨時儲存單元,故該排序方法的空間複雜度o n 由於二路歸併排序中,每兩個有序子串行合併成乙個有序序列時,若分別在兩個有序子串行中出現有相同關鍵字的記錄,則會使前乙個有序子串行中相同關鍵字的記錄先複製,後...

2 路歸併排序

假設初始序列含有n個記錄,則可看成是n個有序子串行,每個子串行的長度為1,然後兩兩歸併,得到 n 2 個長度為2或1的有序子串行 再兩兩歸併,如此重複,直至得到乙個長度為n的有序序列為止,這種排序方法稱為2 路歸併排序。2 路歸併排序中的核心操作是將一維陣列中前後相鄰的兩個有序序列歸併為乙個有序序列...