今天偶然在weixingstudio大侠的blog上看到了烙饼排序问题,研究了一下,做了一点小小的改进,原文地址:
http://blog.csdn.net/weixingstudio/article/details/6912434
比如用35142这个串来研究,递归下去,发现有大量的没有用的(或者说冗余的)交换,比如首次递归,会得到这样的结果:
第一层:53142
第二层:35142
第三层:53142
第四层:35142
……
这个重复一直到Search(step+1)导致111行返回为止。
如果某一层的循环陷入这样的死扣,就只有等到上面这句话发生为止才能终止这个递归分支。
实际上,这个情况是可以预防的,如果在每一次迭代时传入上次迭代的i值,并在本次迭代中跳过相同的i值,则可以消去很多没用的分支,将代码修改如下:
……
Search(0, 0) //原代码第21行
……
void Search(int step, int lastI) //原代码第102行
……
for(i=1;i<m_nCakeCnt;i++) //源代码第129行
{
if ( i != lastI )
{
Reverse(0,i);
m_ReverseCakeArraySwap[step]=i;
Search(step+1, i);
Reverse(0,i);
}
}
这样修改之后,再运行,解是一样的,但是搜索次数由原来的2189次减少到了716次。
运行结果如下:
--->begin
32423
|Search Times|:716
Total Swap times=5