【问题标题】:Has Comb Sort been proven correct? Can it be?梳排序是否被证明是正确的?是真的吗?
【发布时间】:2012-10-02 15:03:00
【问题描述】:

我一直在对梳状排序进行一些研究,并试图弄清楚该算法是否已被证明是正确的。但是,我似乎无法找到有关该算法的大量文档。不过,这是一个非常简单的算法——基本上是冒泡排序的一种变体——我猜这个证明并不复杂。有没有人知道我在哪里可以找到更多关于这方面的信息,或者关于如何从头开始证明它的想法?

不熟悉Comb Sort的朋友可以在Wikipedia article找到伪代码。

【问题讨论】:

  • 什么意思,证明正确?
  • gap==1 时的最后一遍相当于冒泡排序。如果冒泡排序是正确的,那么梳状排序也是正确的。
  • 啊,好点。所以我想你要做的就是证明循环中的gap变量最终达到1。
  • @Blastfurnace 但是冒泡排序需要 O(n^2) 进行排序,仅仅因为一次通过类似于冒泡排序的一次通过,并不意味着整个算法是正确的。
  • @PrathikRajendranM 也许我应该说“舞台”而不是“通过”。事实上,当gap 变为 1 时,梳排序就等同于冒泡排序。

标签: algorithm sorting proof correctness


【解决方案1】:

让我们使用来自Wikipedia的伪代码:

function combsort(array input) is
    gap := input.size
    shrink := 1.3
    sorted := false

    loop while sorted = false
        gap := floor(gap / shrink)
        if gap ≤ 1 then
            gap := 1
            sorted := true
        end if

        i := 0
        loop while i + gap < input.size
            if input[i] > input[i+gap] then
                swap(input[i], input[i+gap])
                sorted := false
            end if

            i := i + 1
         end loop
     end loop
end function

主循环是while sorted = false,并且没有break 语句提前停止循环,这对证明非常有帮助:如果这个循环曾经终止,那么一定是sorted = true。所以真的,我们只需要展示两件事:首先,循环确实终止了,其次,如果 sorted = true 在循环结束时,那么数组实际上是排序的。

  • 循环终止,因为每次在迭代结束时sorted 仍然是false,要么gap 变小,要么gap 保持不变并且数组中inversions 的数量变小. gap 和反转数都是整数,分别以 1 和 0 为界,因此它们不能无限变小。
    • 如果 gap 为 2 或更多,则在该迭代中它会变小(注意 floor 函数)。
    • 如果gap 为1,则它保持为1,并且sorted 在内部循环之前设置为truesorted 只能通过将input[i]input[i+1] 交换为i 来设置回false,其中input[i] &gt; input[i+1]。这样的交换将数组中的反转次数减少了 1。内部循环在任何其他情况下都不执行交换,因此在 gap = 1 时没有交换可以增加反转次数。
  • 如果sorted = true在循环结束,我们知道gap = 1,因为否则sorted不能设置为true。然后我们还知道每个input[i] &lt;= input[i+1],因为如果某些i 不是这样,那么sorted 将被设置为false。因此,sorted 只有在循环结束时数组中的每一对相邻元素都是有序的,即数组已排序时才为真。

【讨论】:

    猜你喜欢
    • 2016-05-17
    • 2017-05-12
    • 2011-06-11
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    • 2014-05-01
    • 1970-01-01
    • 2021-04-14
    相关资源
    最近更新 更多