您的位置:首页 > 其它

算法导论第2版-练习题6.5-8

2013-05-05 20:56 323 查看
/**********************************************

[code]*将k个已经完成排序的链表合并为一个排序链表
*本例从文件test.txt输入所有行,链表用vector来模拟

*对共有n个数据的k个已排序链表排序,时间为O(n*lgk)

***********************************************/

#include<iostream>

#include<fstream>

#include<sstream>

#include<vector>

#include<queue>

usingnamespacestd;


structItem//存储在优先级队列中的项

{

vector<vector<int>>::iteratorlist;//指向对应链表的迭代器

intvalue;//值

Item(vector<vector<int>>::iteratorl,intv):list(l),value(v){}

booloperator<(constItem&r)const//用于优先级队列内部排序,升序排列

{

returnvalue>r.value;

}

};


intmain()

{

//输入已经有序的链表

vector<vector<int>>lists;

ifstreamfin("test.txt");

stringbuf;

while(getline(fin,buf))

{

istringstreamsin(buf);

vector<int>list;

intx;

while(sin>>x)

{

list.push_back(x);

}

lists.push_back(list);

}

fin.close();


//取每个链表的头来建立优先级队列

priority_queue<Item>pq;

vector<vector<int>>::iteratorlist;

inti=0;

for(list=lists.begin();list!=lists.end();list++)

{

if(list->empty())continue;

pq.push(Item(list,list->front()));

list->erase(list->begin());

}


vector<int>result;


//取出队列首加入到结果序列中

//将该队列首对应的链表(如果非空)的头加入优先级队列

//当优先队列为空时排序结束

while(!pq.empty())

{

Itemitem=pq.top();

pq.pop();

result.push_back(item.value);

if(!item.list->empty())

{

pq.push(Item(item.list,item.list->front()));

item.list->erase(item.list->begin());

}

}


//输出结果

vector<int>::iteratorit=result.begin();

cout<<*it;

for(it++;it!=result.end();it++)

cout<<''<<*it;

cout<<endl;

system("pause");

return0;

}

[/code]

给个test.txt的例子:

23254123453
496632244

12378299

2244591235

768179027903678

567850

执行程序,输出为:

12234567789223244505459687812329945366312351790224427903678

Pressanykeytocontinue...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: