《演算法導論》學習筆記 2 1 插入排序

2021-08-15 15:58:51 字數 1709 閱讀 5139

一、筆記

1.迴圈不變式(留待補充)

(1)初始化:迴圈的第一次迭代之前,該式為真。

(2)保持:每次迴圈時保持真。如果n=i為真,則n=i+1為真。

(3)終止:迴圈終止時我們可證明演算法是正確的。

二、原始碼(python)

1.插入排序(python)

array = [4,6,34,56,23,232]     #測試用:原陣列

print('------排序前-------')

for n in range(6):

print(array[n]) #測試用:列印原陣列

for j in range(1,6):

key = array[j]

i = j-1

while i >= 0 and array[i] > key:

array[i+1] = array[i]

i = i - 1

array[i+1] = key

print('------排序後-------')

for n in range(6):

print(array[n]) #測試用:列印分組後陣列

三、練習題

1.用上述演算法說明a=的執行過程。

【答】31->31,41->31,41,59->26,31,41,59->26,31,41,41,59->26,31,41,41,58,59

2.修改上述演算法,改為非公升序

【答】python原始碼如下:

array = [31,41,59,26,41,58]#原陣列

print('------排序前-------')

for n in range(6):

print(array[n])

for j in range(1,6):

key = array[j]

i = j - 1

while i >= 0 and array[i] < key:

array[i+1] = array[i]

i = i - 1

array[i+1] = key

print('------排序後-------')

for n in range(6):

print(array[n])

3.考慮以下查詢問題:

輸入:n個數的乙個序列a=和乙個值v。

輸出:下標i使得v=a[i]或者當v不在a中出現時,v為特殊值nil。

寫出線性查詢的**,掃瞄整個序列來查詢v。使用乙個迴圈不變式來證明你的演算法是正確的。

【答】(1)**(python):

array = [31,41,59,26,41,58]     #測試用:原陣列

v = 159

flag = false

for i in range(1,6):

if array[i] == v:

print(i)

flag = true

if flag == false:

v = 'nil'

print(v)

(2)證明

初始化:

保持:終止:

演算法導論學習筆記 插入排序

用遞迴的方法實現的插入排序演算法 分解 n個元素的排序看成是把第n個元素插入到已排好序的n 1個元素中 解決 對n 1個元素以次遞迴 合併 用插入排序將第n個元素插入到排好序的n 1個元素序列中 public class insertsort arr i 1 key 插入排序的外層函式 param ...

演算法導論 插入排序

introduction to algorithms second edition chapter2,insertion sort date 2014 9 14 include include include define max 50 typedef struct sortarr 直接插入排序 i...

演算法導論 插入排序

插入排序應該算是比較好理解的一種了,原理類似於我們打牌的時候,摸牌插入手中的情景。來看一下圖,立刻就明白了 我們將乙個陣列int a 12 看做一副撲克牌,假設陣列有12個數,那麼撲克牌也一共有十二張,放在一起開始 我們先抽一張拿到手上,這時候,我們不需要排序,因為不論哪一張先被我們抽上來,不論大小...