一、筆記
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個數,那麼撲克牌也一共有十二張,放在一起開始 我們先抽一張拿到手上,這時候,我們不需要排序,因為不論哪一張先被我們抽上來,不論大小...