您的位置:首页 > 其它

K路归并

2016-01-05 14:39 183 查看
K路归并问题可以这样定义

如果存在k个已经排好序的数组,每个数组有数目不等的元素,要求出这些数组整体里最小的k个元素

代码如下,比较粗制滥造,希望提出批评

#include<iostream>
#include <queue>
#include <map>
#include <functional>
using namespace std;
//有k个已经排好序的数组 要求找出m个最小的元素     k为3  m为6
int minPos;
#define MAXSIZE 10
//int a[3][3]={{5,8,12},{4,7,9},{2,3,10}};
typedef struct _Node
{
int value;
int index;
bool operator <(const struct _Node &t)const
{
return value>t.value;
}

}Node;
vector <Node > a,b,c;
int store[MAXSIZE];
void fun(int k,int m)
{

int minNum;
int firstPoint=0,secondPoint=0,thirdPoint=0;
priority_queue<Node> pq;
Node nd;
int i,j;
nd.value=5;
nd.index=0;
a.push_back(nd);
nd.value=8;
nd.index=0;
a.push_back(nd);
nd.value=12;
nd.index=0;
a.push_back(nd);
nd.value=4;
nd.index=1;
b.push_back(nd);
nd.value=7;
nd.index=1;
b.push_back(nd);
nd.value=9;
nd.index=1;
b.push_back(nd);
nd.value=2;
nd.index=2;
c.push_back(nd);
nd.value=3;
nd.index=2;
c.push_back(nd);
nd.value=10;
nd.index=2;
c.push_back(nd);

pq.push(a[firstPoint++]);
pq.push(b[secondPoint++]);
pq.push(c[thirdPoint++]);

for(i=0;i<m;i++)
{
flag=false;
//minNum为其最小元素的下标 也就是属于哪个数组
minNum=pq.top().index;
switch (minNum)
{
case 0:
if(firstPoint==a.size()-1)
{

cout<<pq.top().value<<endl;
pq.pop();
break;
}
cout<<pq.top().value<<endl;
pq.pop();
pq.push(a[firstPoint++]);

break;
case 1:
if(secondPoint==b.size()-1)
{

cout<<pq.top().value<<endl;
pq.pop();
break;
}
cout<<pq.top().value<<endl;
pq.pop();
pq.push(b[secondPoint++]);
break;
case 2:
if(thirdPoint==c.size()-1)
{

cout<<pq.top().value<<endl;
pq.pop();
break;
}
cout<<pq.top().value<<endl;
pq.pop();
pq.push(c[thirdPoint++]);
break;

default:
break;
}

}

}
int main()
{

fun(3,6);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: