我想在教科书中找到以下问题的帮助。
sort (array[], nr_of_item)
{
while(true)
i:=value from an n-sided fair dice roll
j:=value from an n-sided fair dice roll
if (i > j)
swap i and j
if (array[i] > array [j])
swap array[i] and array[j]
end while
}
现在,它说它没有描述正确的算法。 但他们说:
一段时间之后,应对数组进行排序,并证明如果输入未排序,则对数组进行排序的比较次数为O(n ^ 3)。
另一个问题是:
验证算法是否会在O(n)时间内对数组进行排序
由于i和j的随机性,我真的无法理解你如何证明这一点。
答案 0 :(得分:0)
i
和j
引用索引,j
始终调整为两者中的较大者。这意味着索引i
指定的元素(表示为x
)将位于索引j
的元素左侧,表示为y
。
然后,只有当y
和x
未排序时,才会交换元素,这意味着x
大于y
,并且根据其索引位置,位于在y
左边,因此出了故障。这保证了函数只能更接近(不会更远)到排序状态。
现在,至于复杂性,想象一下泡泡排序,它旨在迭代数组,而不是随机选择。这具有n平方的复杂性。这里还有其他事情发生。你随机选择了两个元素,因此n-choose-1倍于气泡排序的复杂性,后者变成了n-cubed。
函数的每次调用都会进行两次比较,特别是2.因此,复杂度是n-cubed乘以2,可以用大-O表示为n-cubed。