簡體   English   中英

三次排序程序的程序正確性

[英]Program correctness for a cubic sort program

我需要一些幫助來證明我的 python 三次排序程序的循環不變性。

到目前為止,我發現了包含兩部分的循環不變量

  1. 0 <= i+1 <= 長度(L)
  2. L[0:i+1] 已排序。
def cubicSort(L):
    i = 0
    while i + 1 < len(L):
        if L[i] > L[i + 1]:
            L[i], L[i + 1] = L[i + 1], L[i] # That is, swap L[i] and L[i + 1].
            i = 0
        else:
            i = i + 1

前提是 L 是一個整數列表 post: 是這個列表是置換和排序的

我不知道如何接近證明

正確性證明有兩個要素:你必須證明當算法終止時,結果是正確的; 你必須證明算法確實終止了。


您的兩個循環不變量都是正確的,但您確實需要證明它們不變量。 為了證明這一點,您必須在循環的第一次迭代之前證明它們為真,如果它們在某個迭代之前為真,那么在該迭代之后它們將為真。

完成之后,很簡單,當循環終止時, i + 1 == len(L)並且因此L[0:i+1]等於L ,因此當循環終止時L被排序。


通常更直接地表明算法終止,通過找到一個循環變體- 一個 integer 量,在循環的每次迭代中變小,當數量達到 0 時導致循環終止。但是對於這個算法,有不是明顯的變體,因為循環計數器i在循環內被重置為0 ,這意味着這個變量不會簡單地單調變大或變小。

這個證明的關鍵是考慮列表中 倒置的數量,其中“倒置”是指一對亂序的列表元素。 在每次迭代中,要么i變大,要么i重置為 0,但反轉次數減少 1。 i不可能繼續變大,並且反轉次數要保持變小而i沒有達到while是不可能的循環界限,或者倒數達到0。一旦列表中沒有倒數, L[i] > L[i + 1]總是假的,所以i會繼續增加到界限,然后循環根據需要終止。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM