我们必须进行操作以排序" n"项目

时间:2017-03-17 19:16:14

标签: algorithm sorting data-structures

假设我有n个具有不同(可能是随机)权重的对象。对象标记为1n,并且未对其进行排序。

我打算根据权重对n个对象进行排序。我唯一拥有的工具是一个带有两个板的刻度,我可以通过它来成对地比较对象,然后注册成对的'日志上的结果。我想知道,在最坏情况中,我需要多少次按比例进行称重操作。

Scale used to do weighing operation on objects pair-by-pair

我认为这很难,我认为我必须进行称重操作的次数是

(n-1) + (n-2) + (n-3) + ... + 3 + 2 + 1 + 0

因此,结果将是(n-1)*n/2。因此,大O将是O(n2)

但我不确定我的计算是否正确。我想知道是否有人可以建议这个解决方案是否错误。如果是这样,那么答案是正确的。

我的理由是,对于对象编号n,我必须将它与n-1对象进行比较,然后我将能够记录有多少对象比它更重/更轻。因此,我将知道对象n在所有对象中的位置。

对于对象编号n-1,我必须使用n-2个对象进行称量操作...对象编号1我必须使用0进行称量操作对象。因此,总称重操作可能是:

(n-1) + (n-2) + (n-3) + ... + 3 + 2 + 1 + 0

2 个答案:

答案 0 :(得分:4)

这是计算机科学的标准结果。您可以使用merge sort执行Θ(n log(n))比较。

没有渐近更好的方法的证明如下:对象最初可以是n!个不同的排列,并且单个称量最多可以将可能性的数量减半。所以log2(n!) = O(n log2(n))是任何最优排序算法比较次数的最坏情况下限。

答案 1 :(得分:1)

您可以优化结果。结果将是O(nlogn)。但怎么样?让我们看看,假设你已经平衡了i对象并对它们进行了排序..

1, 2, 3 ,4 , ...... , i. 

现在,当您必须选择(i+1)th时,您可以使用二进制搜索。首先从您选择的对象中选择中间对象,然后与当前对象进行比较,如果它比当前对象重,则对象将放置在中间的左侧,否则它将放置在中间的右侧。所以任何ith对象都需要log(n)个步骤。因此,对于n个对象,您需要O(nlogn)个步骤。