这是在线笔试的问题之一。
从(1 ... N)编号的书籍已到达仓库。
如果一本书“i”只出现在书籍“i + 1”的左边(对于所有的i,1< = i< = N-1)并且那本书,那么这些书被认为是最好的安排。 N出现在书1的左侧。[是的!任何循环排序的序列都是最好的安排]
收到的图书是随机排列的。现在您的任务是找出实现上述最佳安排所需的最少次数。
请注意,只有有效的移动方法是选择一对相邻的书籍并让它们切换位置。
例如,如果书籍最初的顺序为3 5 4 2 1
解决方案可以
一个。首先交换第二对书:{result:3 4 5 2 1}
湾交换最右边的一对:{result:3 4 5 1 2}
因此,在2个步骤中,我们实现了最佳安排。
我尝试但无法找到解决方案。首先我虽然我将数组分成两个数组然后我将在两个数组上应用插入排序,但这也无效。 请帮我找一个这个问题的算法。
答案 0 :(得分:1)
N,1可以是序列中的任何位置。例如1..5,可以是3,4,5,1,2。所以第一个数字可能是1..5,即5倍和Previous question一样复杂。所以,你必须做5次。使用具有可替换比较功能的排序算法。
因此,对于第3次测试,比较将是: -
// returns <0, 0 or >0
int compare(a,b){
return ((b+N-3)%N) - ((a+N-3)%N);
}