算法學習筆記(一):插入排序和線性查找
阿新 • • 發佈:2018-05-22
插入排序 算法學習 AS 獲取 ear array import 右移 創建
(一)插入排序
看下面這張圖片:把打牌時手上的牌抽象為一個列表A,j表示當前最新抓的牌的索引(先放到手上最右邊)
索引 j =0 時 A[j] = 3
j >= 1時,
1、我們拿到第2張牌時,我們會把 7和3比較一下(3<7),然後放到3的後面
(此時 A[0] = 3 A[1] = 7)
2、拿到第3張牌時 ,我們會把 1從右到左和前面的牌比較(1<7,1<3),然後插入到3的前面。
(此時 A[0] = 1 A[1] = 3 A[2] = 7)
3、轉換為代碼邏輯,大概意思就是(A[j]代表當前抓的牌。下面假設先把抓的牌放到手上最右邊(右1就是手上最新抓的牌),然後再去調整位置,就和上圖中的1一樣)
key = A[j] #當前抓的牌(右1)
i = j – 1 #獲取前一牌的索引(右2)
while key < A[i]: #如果當前抓的牌小於前一張牌(從右到左依次比較)
A[i+1] = A[i] #把前一張牌往右移一個位置
i = i – 1 #繼續獲取更前一張牌的索引(第一次運行 是 右3的索引,第二次是右4的索引。。。)
A[i+1] = key #key >=A[i] 時,將當前抓的牌插入到A[i]的後面(就像上面把7插到5的後面一樣)
比喻可能不是非常恰當,不過大概是這樣的意思。
實現代碼:
1 import numpy as np2 3 #創建一個ndarray對象 4 A = np.array([5,2,4,7,6,10,1,3,9]) 5 6 #升序排序版本 7 for j in range(len(A)): 8 key = A[j] 9 i = j - 1 10 while i >= 0 and key < A[i]: 11 A[i+1] = A[i] 12 i = i-1 13 A[i+1] = key 14 15 print(A) 16 #降序排序版本 17 for j in range(len(A)): 18 key = A[j]19 i = j - 1 20 while i >= 0 and key > A[i]: 21 A[i+1] = A[i] 22 i = i -1 23 A[i+1] = key 24 25 print(A)
(二)線性查找
1 import numpy as np 2 3 #找到結果,返回索引,否則返回None 4 def search(array,key): 5 for j in range(len(array)): 6 if array[j] == key: 7 return j 8 return None 9 10 array = np.array([5,2,4,7,6,10,1,3,9]) 11 key = 10 12 13 print(search(array,key))
算法學習筆記(一):插入排序和線性查找