演算法思想
:1. 從k個鍊錶中取出每個鍊錶的第乙個元素,組成乙個大小為k的陣列arr,然後將陣列arr轉換為最小堆,那麼arr[0]就為最小元素了
2. 取出arr[0],將其放到新的鍊錶中,然後將arr[0]元素在原煉表中的下乙個元素補到arr[0]處,即arr[0].next,如果arr[0].next為空,即它所在的鍊錶的元素已經取完了,那麼將堆的最後乙個元素補到arr[0]處,堆的大小自動減一,迴圈n-k次即可。
為了方便貼上,把.h和.cpp都弄在一起,首先是兩個類list和node,然後就是兩個關於最小堆操作的函式,**有點長,但是一點都不難,因為你肯定看過最大堆的操作,那麼最小堆就大同小異了:
#include
using
namespace
std;
class
node
;class
list;//
修正i的位置,在此處已經假設i的子節點都是堆
void
min_heapify(node* &a,
inti,
intlength);
//建立陣列的堆
void
build_min_heap(node* &a,
intlength);
intmain()
node* arr =
newnode[k];
arr[
0] = *(list_one->first);
arr[
1] = *(list_two->first);
arr[
2] = *(list_three->first);
arr[
3] = *(list_four->first);
arr[
4] = *(list_five->first);
//先對這k個排序
build_min_heap(arr, k);
list* list =
newlist();
//每次取arr[0]的下乙個node,如果node為空的話, //
則把堆末尾的元素補到arr[0],由於有--k,所以堆的大小減一
while
(k > 0)
node* begin = list->first;
while
(begin != null)
return0;
}void
min_heapify(node* &a,
inti,
intlength)
if(right <= length -
1&& a[right] < a[smallest])
if(smallest != temp)
else
break;}
}void
build_min_heap(node* &a,
intlength)
node::node()
node::node(
intd)
node::
operator
node()
const
bool
node::
operator
<(
const
node& temp)
list::list()
void
list::insert(
intd)
prev->next = node;}}
演算法導論 習題 6 5 8
題 請給出乙個時間為o nlgk 用來將k個已排序鍊錶合併為乙個排序鍊錶的演算法。此處n為所有輸入鍊錶中元素的總數。k個已排序鍊錶,假設每乙個鍊錶的第乙個元素為root i i 1,2,3.k 那麼可以為這k個元素root i 構造乙個最小堆heap min,其時間複雜度為o lgk 此時堆頂元素假...
演算法導論習題解答 2 3 7
2.3 7 請給出乙個執行為 nlgn 的演算法 偽碼 使之能在給定乙個由n 個整數構成的集合s 和另乙個整數x 時,判斷出s 中是否存在有兩個其和等於x 的元素。解 解題思路 先對集合s進行歸併排序,然後新建乙個陣列s1,使得s1 i x s i 再將兩個陣列並起來。如果在並的過程中發現有兩個元素...
演算法導論6 5 7習題解答
clrs 6.5 7 heap delete a,i 操作將結點i中的項從堆a中刪去。對含n個元素的最大堆,請給出時間為o lgn 的heap delete的實現。演算法思想 對即將被刪的i處的元素設定為堆中末尾的元素,同時堆的大小減1.此題同時附帶6.2 5的解答 如下 1 include 2 u...