题目:
分布式系统中的RPC请求经常出现乱序的情况。
写一个算法来将一个乱序的序列保序输出。例如,假设起始序号是1,对于(1, 2, 5, 8, 10, 4, 3, 6, 9, 7)这个序列,输出是:
1
2
3, 4, 5
6
7, 8, 9, 10
上述例子中,3到来的时候会发现4,5已经在了。因此将已经满足顺序的整个序列(3, 4, 5)输出为一行。
要求:
1. 写一个高效的算法完成上述功能,实现要尽可能的健壮、易于维护
2. 为该算法设计并实现单元测试
#include<iostream>
#include<vector>
using namespace std;
class Queue
{
public:
int val;
int num;
Queue()
{
num = 0;
val = 0;
}
};
int main()
{
vector<Queue> queue;
int temp,num=0;
do //接收输入,作为无序序列
{
cin >> temp;
Queue * p = new Queue;
p->val = temp;
p->num = ++num;
queue.push_back(*p);
if (cin.get() == '\n')
break;
} while (1);
vector<Queue> cpy; //拷贝一份
for (auto i : queue)
cpy.push_back(i);
for (auto begin = cpy.begin(), end = cpy.end(); begin != end;--end) //冒泡排序
{
for (auto it = begin; it != (end-1); ++it)
{
if (it->val > (it + 1)->val)
{
Queue * p = new Queue;
p->num = it->num;
p->val = it->val;
it->num = (it + 1)->num;
it->val = (it + 1)->val;
(it + 1)->num = p->num;
(it + 1)->val = p->val;
}
}
}
temp = 1;
for (auto i : cpy) //保序输出
{
if (i.num <= temp) //若当前数字编号小于输出的最大编号,则直接输出不需换行
cout << i.val << " ";
else //否则当前编号成为最大编号,并且换行
{
temp = i.num;
cout << endl;
cout << i.val << " ";
}
}
}