多路歸併排序

2021-06-19 02:08:16 字數 1383 閱讀 4158

我們有如下乙個問題:對於若干個長度相同的序列,將其合併成乙個有序的序列。

暴力的方法顯然是不可取的,這裡可以利用優先佇列來處理這個問題。首先從簡單的開始,對於2路歸併排序,設兩個序列為,,將,排序,有

a1<=a2<=a3<=...<=an

b1<=b2<=b3<=...<=bn

建立乙個優先佇列,佇列中首先存入元素(a1,0),(b1,1),其中標誌0,1分別表示元素中的值屬於第乙個序列還是第二個序列,那麼第一次從佇列中取出的即是此刻的最小值,這時候我們再將取出元素所在的序列的下乙個元素放入佇列,例如首先取出的是(a1,0),那麼放入佇列中的即是(a2,0),這為什麼是正確的呢?因為對於a1,b1來說,若取出的是a1,那麼a1說到這裡k路歸併排序的演算法也就呼之欲出了,很顯然每次放入的元素加上乙個序列的列號,然後再優先佇列裡面操作即可。演算法的複雜度:假設一共有n個元素,有k個序列,每次訪問複雜度為logk(用c++的stl即可),總的複雜度為o(nlogk)。

c++實現:

[cpp]view plain

copy

struct

item  

bool

operator < (

const

item& a)

const

};  

void

merge(

int* a,

int* b,

int* c,

intn)else

}  }  

問題舉例:

有這樣k個序列,a1,a2,...,an,

b1,b2,...,bn,

....

每乙個序列中取乙個元素,求這k個元素的和,共有k^k個和,求最小的k的和,

首先還是看兩個序列:a1+b1<=a1+b2<=...<=a1+bn

a2+b1<=a2+b2<=...<=a2+bn

...

an+b1<=an+b2<=...<=an+bn

那麼對上述序列進行歸併排序即可求得答案,注意的是我們用二元組(s,b)來表示乙個元素,s是和,b是b的下標,那麼下一次要存入的元素即是(s-b[b]+b[b+1],b+1)

**如下:

[cpp]view plain

copy

struct

item  

bool

operator < (

const

item& a) 

const

};  

void

merge(

int* a,

int* b,

int* c,

intn)  

}  

多路歸併排序

下面的問題描述及相關文字都參考於csdn中july的部落格,在此對july表示感謝。july的部落格位址如下 在對海量資料排序時,有時不能把資料全部匯入到記憶體中,這時需要用到多路歸併排序。比如輸入 乙個最多含有n個不重複的正整數 也就是說可能含有少於n個不重複正整數 的檔案,其中每個數都 小於等於...

多路歸併排序

雪壓枝頭低,雖低不著泥 今天準備放假,無聊看到乙個場景題,問題如下 有乙個檔案裡面儲存著很多很多很多的無序的數,然後要求進行乙個排序,記憶體限定,磁碟足夠 然後搗鼓了一下,學到了一種新技能 多路歸併排序 學習的過程是這樣的 第一步 把儲存著很多很多很多數的檔案進行切割,切割成n個小檔案,每個小檔案都...

多路歸併排序的實現

為了更好地測試程式,首先利用以下方法生成了1000000個整數,每個整數均不相同 生成隨機排列的1000000個數字,每個數字都不相同 const int size 1000000 int num size void produce srand unsigned time null 隨機交換隨機的兩...