【问题标题】:Why does the sorting algorithm work correctly?为什么排序算法可以正常工作?
【发布时间】:2016-05-25 07:20:06
【问题描述】:

我有一个排序算法。我知道它可以用许多其他更简单的方式编写,但这不是我的问题的重点。

这是算法

sort(A : Array of N, i : N, j : N)
assert j-i+1 isTwoPotency
if A[i] > A[j] then swap A[i] and A[j]
if i+1 < j then
    k:= (j − i + 1)/4
    sort(A, i, j − 2k)
    sort(A, j − 2k + 1, j)
    sort(A, i + k, j − k)
    sort(A, i, j − 2k)
    sort(A, j − 2k + 1, j)
    sort(A, i + k, j − k)

我的问题是,为什么算法在以下情况下正常工作

sort(A, 1, length(A))

数组将是:

A[1 . . . length(A)]

length(A) 是一个二元函数,我们可以假设数组中没有相同的数字。我已经对其进行了测试,没有错误,所以我认为它可以正常工作。但是我如何证明算法在这些条件下总是正确的呢?

我想知道算法需要多长时间作为运行时间。 如果你能给我运行时间,那就太好了(这是我最了解的那个)

f(n) = Θ(g(n))

【问题讨论】:

  • 如果你不知道,如果你的代码工作正常,然后编写测试,它会检查。
  • 我已经测试过了,我只想要上面提到的证明和运行时间。 (我编辑了问题)
  • 我用 16 个数字测试了代码,它从索引 2 开始对所有数字进行排序,但第一个数字没有排序.. 所以它几乎可以工作,但不是真的,至少不是数字我测试过。我的测试号码:(11,21,13,41,15,16,71,28,19,10,1,12,3,14,5,6)。您的算法将其排序为:(11,1,3,4,6,10,12,13,14,15,16,19,21,28,41,71).. 注意第一个数字没有排序。
  • @SergioFernandez 伪代码使用 1 索引数组。
  • 不,你的代码和我的有区别,你的数组从0开始,不是1,当我通过数组修改为从0开始,并改变了行,swap(a[i], a[j]) to sawp(a[i-1],a[j-1]) 它可以工作,所以,我将循环查看代码以了解它为什么会有所不同,但这就是你所做的与 teh 不同的地方伪代码。你的数组从 0 开始。

标签: algorithm performance sorting big-o


【解决方案1】:

正确性

将数组分成四等份,从 A1 到 A4,并考虑每个元素最终应位于的子数组。

  • 在前两次递归调用之后,属于 A1 的所有元素都位于 A1 或 A3 中。同样,所有 A4 元素都位于 A2 或 A4 中。

  • 第三次递归调用后,所有A1元素都在A1或A2中,所有A4元素都在A3或A4中。

  • 在接下来的两次递归调用之后,所有A1元素都在A1中排序,所有A4元素在A4中排序。这会将所有 A2 和 A3 元素留在 A2 或 A3 中。

  • 在最后一次递归调用之后,所有 A2 和 A3 元素都按排序顺序位于正确的子数组中。这样数组就排序好了。

插图:

运行时

请注意,当我们对长度为n 的数组执行算法时,我们必须对长度为n/2 的数组执行六次算法。这会产生以下重复:

  • T(1) = O(1)
  • T(n) = 6 T(n/2) + O(1)

解决我们得到T(n) = O(6^log2(n)) = O(n^log2(6)) ≈ O(n^2.585)的递归

【讨论】:

    猜你喜欢
    • 2020-07-16
    • 1970-01-01
    • 2012-03-29
    • 1970-01-01
    • 2018-04-13
    • 2014-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多