附加题三:
分布式系统中的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)为该算法设计并实现单元测试
--------------------------------------------------------------------------------------------------------------------------------------------
算法思路(自己的思路)
程序如下(程序里的有些变量可能和上面算法描述中的不一致):
edition one:
struct node
{
int value;
bool visit;
};
void print_seq(int seq[], int len)
{
vector<node> node(len + 1);
int i = 0;
for (i = 0; i <len; i++)
{
node[seq[i]].value = i;
node[seq[i]].visit = false;
}
for (i = 0; i <= len; i++)
{
cout << node[i].value << "--";
}
cout << endl;
int j = 0;
int k = 0;
int next_print = 1;
for (j = 0; j < len; j++)
{
node[seq[j]].visit = true;
if (seq[j] == next_print)
{
cout << seq[j];
for (k = next_print + 1; k <= len; ++k)
{
if (node[k].visit == false)
{
cout << endl;
break;
}
else
cout << "," << k;
}
next_print = k;
}
}
}
int main(int argc, char *argv[])
{
int test[] = {2, 5, 8,1, 10, 4, 3, 6, 9, 7 };
int len = sizeof(test) / sizeof(test[0]);
print_seq(test, len);
return 0;
}