根据题意作出思考如下图:
可以发现,这个 fatest mouse 的筛选是一层一层下来的,每一层都将数组分为两部分——一部分继续下一轮筛选而另一部分执行记下排名就行。所以很自然能想到每一轮都会产生中间数据,这些中间数据需要变量记录下来,所以进一步思考如下图:
遍历原数组,筛选出的下一轮数据保存到影子数组(中间数据),至于 loser 因为要记录排名所以也要保存下来——这里先随便用 vector 保存。可以用这个思路接着推演,最终得到的一个元素就是 fatest mouse。在这个过程中需要考虑 loser 的排名怎么记录比较方便,我这里是数 winers 有多少个,那么 loser 的排名就等于 winers 个数加一,如下图:
综合上述思路,得到代码思路:
/* 伪码 */ while (数组剩余长度不等于 1) { 组 = 0; base = 0; end = 0; while (end < 数组剩余长度) { step = 数组剩余长度 - base < NG ? 数组剩余长度 - base : NG; end += step; sort(base, end, cmp);//cmp() 为递增序 vector.push_back[base + 1, end);//将除最大值外其它元素追加到 vector max = 数组[base]; 数组[组++] = max; base = end; } func(vector 里所有元素名次 = 组 + 1);//这里就是将所有 loser 记下排名的处理步骤 数组剩余长度 = 组; vector.clear(); }