“分而治之”的重点是将工作分成多个较小的问题;然后你解决较小的问题并将它们汇总,直到它们组合成一个解决方案。这几乎意味着递归解决方案。
对于任何递归函数,您总是需要一个“基本案例”。这将是一个很容易解决的简单案例。例如,如果您只有一个罐子和一个盖子,那么您只需返回罐子与盖子匹配即可。(因为作为问题陈述的一部分,每个罐子总是有一个匹配的盖子。)
所以一个开始的地方是一个简单的程序,它只适用于长度为 1 的罐子/盖子列表。然后添加更多的机器使其更有能力。
使用快速排序,您选择一个位置来划分数字(“枢轴”),然后进行非常粗略的排序(只需将应该在枢轴左侧但在右侧的数字移到左侧,反之亦然)。然后在子列表上递归调用快速排序。最终,对快速排序的每个递归调用都会遇到一个基本情况(长度为 1 的子列表);一旦他们都达到了基本情况,快速排序就完成了。(注意:有一些方法可以优化快速排序并通过添加更多代码使其更快,但我在这里谈论的是最简单的快速排序实现。)
也许在这种情况下,您应该从仅包含从 1 到 n 的数字的长度为 n 的列表开始,然后交换数字直到您有正确的列表?
唔。对于长度为 2 的列表,只有两种可能性:列表是否对齐。如果他们排队,你就完成了。如果没有,则交换数字以使它们对齐,然后就完成了。唔。这在某种程度上类似于排序,但不能像排序时那样直接比较数字。(在排序中,你总是知道 3 排序低于 5,但在这里可能不是这样。)所以,现在考虑一种方法来分解列表并继续这样做,直到你有一个长度为 2 或长度为 1 的子列表,然后处理那些琐碎的案件。
听起来是个有趣的问题。我希望你喜欢它的工作。