梳子排序已被证明是正确的吗?是真的吗?

时间:2012-10-02 15:03:00

标签: algorithm sorting proof correctness

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

对于那些不熟悉梳子排序的人,你可以在Wikipedia article找到伪代码。

1 个答案:

答案 0 :(得分:0)

让我们使用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语句尽早停止循环,这对于证明这一点非常有帮助:如果该循环终止,则{{1 }}。因此,实际上,我们只需要显示两件事:首先,循环确实终止了,其次,如果在循环结束时sorted = true则对数组进行了排序。

  • 循环终止是因为每次迭代结束时每次sorted = true仍为sorted,或者false变小,或者gap保持不变,并且数组中的inversions变小。 gap和反转次数都是分别由1和0限制的整数,因此它们不能无限地变小。
    • 如果gap为2或更大,则该迭代会变小(请注意gap函数)。
    • 如果floor为1,则它保持为1,并且在内循环之前将gap设置为sorted。只能将truesorted交换为false,其中input[i]才能将input[i+1]重置为i。这样的交换将数组中的反转次数减少了1。内部循环在任何其他情况下都不会执行交换,因此,input[i] > input[i+1]时,任何交换都不会增加反转次数。
  • 如果gap = 1位于循环末尾,则我们知道sorted = true,因为否则gap = 1不能设置为sorted。然后我们也知道每个true,因为如果某些input[i] <= input[i+1]并非如此,则i将会被设置为sorted。因此,false仅在循环结束时才正确,即数组中的每对相邻元素都是有序的,即对数组进行排序。