具有无限交换的排序算法

时间:2015-01-02 08:49:30

标签: algorithm sorting

我想在教科书中找到以下问题的帮助。

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的随机性,我真的无法理解你如何证明这一点。

1 个答案:

答案 0 :(得分:0)

ij引用索引,j始终调整为两者中的较大者。这意味着索引i指定的元素(表示为x)将位于索引j的元素左侧,表示为y

然后,只有当yx未排序时,才会交换元素,这意味着x大于y,并且根据其索引位置,位于在y左边,因此出了故障。这保证了函数只能更接近(不会更远)到排序状态。

现在,至于复杂性,想象一下泡泡排序,它旨在迭代数组,而不是随机选择。这具有n平方的复杂性。这里还有其他事情发生。你随机选择了两个元素,因此n-choose-1倍于气泡排序的复杂性,后者变成了n-cubed。

函数的每次调用都会进行两次比较,特别是2.因此,复杂度是n-cubed乘以2,可以用大-O表示为n-cubed。