#include <vector>
#include <list>
#include <iostream>
#include <limits.h>
using namespace std;
template<typename Comparable>
class minKList
{
public:
explicit minKList(int capacity=100)
:array(capacity+1),currentSize(0)
{ }
explicit minKList(const vector<list<Comparable>> &items)
:array(items.size()+10),currentSize(items.size())
{
vec=items;
for(int i=0;i<vec.size();++i)
array[i+1]=&vec[i];
buildMinHeap();
}
void merge()
{
int num=0;
for(int i=1;i<=currentSize;i++)
num+=array[i]->size();
for(int i=0;i<num;i++)
{
minHeapIfy(1);
ret.push_back(array[1]->front());
array[1]->pop_front();
if(array[1]->empty())
array[1]->push_back(INT_MAX);
}
}
void mergePrint()
{
for(auto v:ret)
cout<<v<<" ";
cout<<endl;
}
private:
int currentSize;
vector<list<Comparable>> vec;
vector<list<Comparable>*> array;
vector<Comparable> ret;
void buildMinHeap()
{
for(int i=currentSize/2;i!=0;i--)
minHeapIfy(i);
}
void minHeapIfy(int i)
{
int child;
list<Comparable>* tmp;
tmp=array[i];
for(;i*2<=currentSize;i=child)
{
child=i*2;
if(child!=currentSize&&array[child+1]->front()<array[child]->front())
++child;
if(array[child]->front()<tmp->front())
std::swap(array[i],array[child]);
else
break;
}
}
};
int main()
{
vector<list<int>> vec;
list<int> list1{5,10,15,20};
list<int> list2{4,8,12,16};
list<int> list3{1,18,25,99};
vec.push_back(list1);
vec.push_back(list2);
vec.push_back(list3);
minKList<int> heap{vec};
heap.merge();
heap.mergePrint();
}
算法导论6.5-9,K个有序链表合并 nlgn
最新推荐文章于 2023-04-13 22:04:42 发布