算法导论第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...
相关文章推荐
- 算法导论 练习题 6.5-3
- 算法导论 练习题 6.5-6
- 算法导论 练习题 6.5-7
- 算法导论 练习题 6.5-8
- 算法导论 练习题 6.5-9
- POJ 3669 Meteor Shower 《挑战程序设计竞赛(第2版)》练习题
- 算法导论附录练习题
- 算法导论第三版 22.1 图的表示 练习题答案全解析
- 算法导论 第2版 7.3 快速排序随机化版本
- 算法导论 练习题 5.3-2
- 算法导论 练习题 6.1-7
- 算法导论(第三版) 第三章练习题
- 算法导论 练习题 13.1-5
- 算法导论 练习题 13.4-7
- 算法导论 练习题 14.1-7(逆序对)
- 算法导论 练习题 14.3-5
- 算法导论 练习题 16.1-4
- 算法导论 练习题 17.2-3
- 算法导论 练习题 17.3-6
- 算法导论第16章练习题 16.1-4