ウィキペディアの疑似コードを使用しましょう:
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
. つまり、1 つ目はループが終了すること、2 つsorted = true
目はループの最後で配列が実際にソートされることです。
- 各時間
sorted
がfalse
反復の終わりにあるため、ループは終了します。時間gap
が小さくなるかgap
、同じままで、配列内の反転の数が少なくなります。と反転の数はgap
それぞれ 1 と 0 で囲まれた整数であるため、無限に小さくなることはありません。
gap
2 以上の場合、その反復で小さくなります (floor
関数に注意してください)。
- 1 の場合
gap
は 1 のままで、内側のループの前sorted
に設定されました。スワップすることによってのみ元に戻すことができます。このようなスワップは、配列内の反転の数を 1 減らします。内側のループは、他の状況ではスワップを実行しないため、.true
sorted
false
input[i]
input[i+1]
i
input[i] > input[i+1]
gap = 1
- ループの最後にある場合、それ以外の場合は に設定できないため、それが
sorted = true
わかります。これが一部の に当てはまらない場合は、 に設定されているため、すべてのこともわかります。したがって、配列内の隣接する要素のすべてのペアが正しい場合、つまり配列がソートされている場合にのみ、ループの最後で真になります。gap = 1
sorted
true
input[i] <= input[i+1]
i
sorted
false
sorted