合併K個有序陣列

2021-10-25 18:48:06 字數 1269 閱讀 5589

問題:有k個長度為n的有序陣列,將著這些個陣列合併為乙個有序的陣列。

問題的改進: 有k個長度不定的有序陣列,將這些陣列合併為乙個有序陣列。

三種解法:

第一種解法的時間複雜度為:o(nlog2n)

第二種解法的時間複雜度為:o(knlogn)

第三種解法的時間複雜度為:o(mnlogn)(m為元素總個數)

第一二種解法,比較簡單,這裡不再贅述。下面只分析第三種解法;

解法三解題思路:

首先遍歷所有的陣列,確定最終所有元素的個數(count);

建立乙個大小為count的陣列用來儲存最終結果,再建立乙個大小為k的小根堆;(小根堆儲存的元素型別,是結構體)

先將每個陣列的第乙個元素插入到小根堆中,進行一次堆排序;

重複下面的操作,直至元素全部插入結果集中:

a. 取出堆頂元素(堆中最小元素),儲存到結果中;

b. 將堆頂元素所在陣列的下乙個元素替換到堆頂,如果堆頂元素是其所在陣列的最後 乙個,將堆頂元素替換成int_max;

c. 進行一次堆排序;

#include

#include

#include

#include

using

namespace std;

typedef

struct node

}newnode;

struct compare};

vector<

int>

mergearrays

(vectorint>>

& arrs)

while

(!pq.

empty()

)//堆裡面還有資料

else

}return res;

}int

main()

,,,}

;//vector> arrs, };

vector<

int> res =

mergearrays

(arrs)

;for

(auto c : res)

cout << c <<

" ";

cout << endl;

return0;

}

思考: 為什麼用emplace 而不用push_back 這是為了避免不必要的記憶體拷貝;

合併k個有序陣列

在網上看到的今日頭條面試題 先說下自己的想法吧 假設陣列是從小到大的 用傳統的歸併排序,先把第乙個陣列 a 拿出來,然後第二個陣列的第乙個插入a中 此時使用二分查詢,l 1 r len a,假設最後插入的地方是poi 那麼插入第二個數的時候 l poi 1 r len a 1 這東西的時間複雜度是常...

23 合併K個有序陣列

利用21題合併兩個有序陣列的 使用for迴圈進行合併,效率較低 參照第一名的 使用分治,改變對陣列的處理方法,可以大幅度提高處理效率 修改後 public listnode mergeklists listnode lists public static listnode sort listnode...

合併兩個有序陣列

例如 陣列a1 陣列a2 則合併為a3 思路 依次掃瞄a1和a2的元素 比較當前元素的值,將較小的元素賦給a3,直到乙個陣列掃瞄完畢,然後將另乙個陣列的剩餘元素賦給a3即可。陣列a3的容量需要容納a1和a2兩個陣列和長度和。實現 include include void merge int a1,i...