算法導論1.2 插入排序

這個小結主要是用插入排序法,講了一下什么是“循環不變式”,這個方法主要是用來證明你的算法是OK的,用python實現一下書里面的例子

arr = [5, 2, 4, 6, 1, 3]
for i in range(len(arr)):
    cursor = arr[i]
    pos = i
    while pos > 0 and arr[pos - 1] > cursor:
        arr[pos] = arr[pos -1]
        pos = pos - 1
    arr[pos] = cursor
    print(arr[:i+1])

輸出如下,這個算法也好理解,想象一下斗地主時,剛開始摸牌,一張一張拿過來時在自己手里排序的情形,當拿到一張新的牌,和最邊上的比一下,如果比這個小,再跟倒數第二個比,直到不比它小的時候插進去,這樣手里的牌就一直是排好序的,等牌都發完,一眼就能看出是不是可以搶地主了

[5]
[2, 5]
[2, 4, 5]
[2, 4, 5, 6]
[1, 2, 4, 5, 6]
[1, 2, 3, 4, 5, 6]

循環不變式分三部分,初始化,保持,終止。看完書我覺得應該是這么理解,在第一次循環時只有一個5,排序OK,這說明初始化被證明成立;當開始循環時,每一次循環,就是咱們輸出的這個子數組,都是排序OK的,那可以證明保持階段成立;在排序完成后可見是OK的,這樣就可以證明,終止成立。通過這三個階段的證明,就可以斷定,更多的數據放進來,仍然是排序OK的,那這個算法就沒問題。當然,插入排序比較典型,特征很明顯。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。