我一直在研究梳子排序,我试图弄清楚算法是否已被证明是正确的。但是,我似乎无法找到关于该算法的大量文档。这是一个非常简单的算法 - 基本上是冒泡排序的一个变种 - 而且我猜测证明并不复杂。有没有人有关于我可以在哪里找到更多信息的想法,或者有关如何从头开始证明它的想法?
对于那些不熟悉梳子排序的人,你可以在Wikipedia article找到伪代码。
答案 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
。只能将true
和sorted
交换为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
仅在循环结束时才正确,即数组中的每对相邻元素都是有序的,即对数组进行排序。