【问题标题】:Sorting algorithm with infinite swaps无限交换的排序算法
【发布时间】:2015-01-02 08:49:29
【问题描述】:

我需要一些帮助来解决我在教科书中发现的以下问题。

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

【问题讨论】:

  • 我猜这是一个概率事件。随着迭代次数的增加,数组未排序的概率降低,可能存在渐近关系。
  • 但是在这里你的循环运行了无限时间,我的意思是什么会停止或破坏你的 while() ?
  • 这并不是要停止。教科书中给出的算法是错误的,因为它永远不会停止。但这两个问题应该还是可以回答的。

标签: algorithm sorting


【解决方案1】:

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

然后,仅当 yx 未排序时才交换元素,这意味着 x 大于 y 并且根据它们的索引位置,位于 y 的左侧,因此出现故障。这保证了函数只会更接近(而不是更远)排序状态。

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

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

【讨论】:

  • 您在第 3 段第 3 句中的(统计)分析不引人注目。
  • @Pieter 嗯...是的,我自己也同意你的看法。希望看到有人解决复杂性。
  • 考虑只有 N 次交换需要完成的情况,特别是因为在最后一个位置而不是第一个位置中的最小元素,但所有其他位置都只有一个位置,有多少比较将是在所有必要的交换生成之前,以正确的顺序预期?
猜你喜欢
  • 2019-04-09
  • 2019-11-21
  • 1970-01-01
  • 1970-01-01
  • 2018-05-30
  • 1970-01-01
  • 2020-09-12
  • 2016-08-31
  • 1970-01-01
相关资源
最近更新 更多