1. 程式人生 > >算法學習筆記(一):插入排序和線性查找

算法學習筆記(一):插入排序和線性查找

插入排序 算法學習 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 np
2 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))

算法學習筆記(一):插入排序和線性查找