python插入排序算法總結
插入排序算法總結:
插入算法的核心是 每次循環到一個數時,都認為這個數之前的數列都是排好序的,將一個數插入到已經排好序的有序數列中,從而得到一個新的、個數加一的有序數列。
過程:從第一個元素開始,第一個數肯定是有序的,把第二個數和第一個數相比,插入到合適的位置,這樣前兩個數就是有序的了,接著,把第三個元素插入到前面包含兩個元素的有序列表中,依次類推,知道插完第n個數據。
第一步:拿一個有序數列為基礎,後邊加一個數,實現插入排序的邏輯
a=[3,5,8,10,6]
代碼
#encodjng=utf-8
a=[3,5,8,10,6]
print a
index=len(a)-1
for j in range(index-1,-1,-1):
print "j:",j
if a[j+1] < a[j]:
a[j+1],a[j]=a[j],a[j+1]
print "a[j+1] < a[j]:","%s < %s"%(a[j+1],a[j])
print " a:",a
else:
break
print a
執行過程:
D:\test>python test.py
[3, 5, 8, 10, 6]
j: 3
a[j+1] < a[j]: 10 < 6
a: [3, 5, 8, 6, 10]
j: 2
a[j+1] < a[j]: 8 < 6
a: [3, 5, 6, 8, 10]
j: 1
[3, 5, 6, 8, 10]
可以看到,默認列表前4個數3,5,8,10是從小到大排好序的,然後j從10的坐標3向前遍歷到3的坐標1;
當j為3時,用j坐標後邊的值(6)和j坐標的值做對比,如果6小(j[j+1] < a[j]),把6和j坐標的值交換;
當j為2時,用j坐標後邊的值(還是6,因為6已經換到這兒了),如果6小(j[j+1] < a[j]),把6和j坐標的值交換;
以此類推,就間接的實現了程序的邏輯:用新的數從後往前依次和前面的排好序的數列對比,小於的話就放到前邊,類似冒泡排序的反過程,之所以說是間接,是因為對比的過程並不是用新的數6和依次和前邊的數做對比,而是用a[j+1]和a[j]這種取坐標的方式作對比,只不過這種下標的方式取得結果看上去是用6和前面的數依次做對比。所以,同一種算法思路可能會有多種實現方式,這裏,也可以用臨時變量的形式實現直觀的用6和前邊的數作對比,以後嘗試實現。
第二步:將列表的所有元素按照步驟一的邏輯實現
代碼:
#encodjng=utf-8
a=[9,2,5,1,0,4]
print a
index=len(a)-1
for i in range(index):
print "i:",i
for j in range(i,-1,-1):
print "j:",j
if a[j+1] < a[j]:
a[j+1],a[j]=a[j],a[j+1]
print "a[j+1] < a[j]:","%s < %s"%(a[j+1],a[j])
print " a:",a
else:
break
print a
執行過程:
D:\test>python test.py
[9, 2, 5, 1, 0, 4]
i: 0
j: 0
a[j+1] < a[j]: 9 < 2
a: [2, 9, 5, 1, 0, 4]
[2, 9, 5, 1, 0, 4]
i: 1
j: 1
a[j+1] < a[j]: 9 < 5
a: [2, 5, 9, 1, 0, 4]
j: 0
[2, 5, 9, 1, 0, 4]
i: 2
j: 2
a[j+1] < a[j]: 9 < 1
a: [2, 5, 1, 9, 0, 4]
j: 1
a[j+1] < a[j]: 5 < 1
a: [2, 1, 5, 9, 0, 4]
j: 0
a[j+1] < a[j]: 2 < 1
a: [1, 2, 5, 9, 0, 4]
[1, 2, 5, 9, 0, 4]
i: 3
j: 3
a[j+1] < a[j]: 9 < 0
a: [1, 2, 5, 0, 9, 4]
j: 2
a[j+1] < a[j]: 5 < 0
a: [1, 2, 0, 5, 9, 4]
j: 1
a[j+1] < a[j]: 2 < 0
a: [1, 0, 2, 5, 9, 4]
j: 0
a[j+1] < a[j]: 1 < 0
a: [0, 1, 2, 5, 9, 4]
[0, 1, 2, 5, 9, 4]
i: 4
j: 4
a[j+1] < a[j]: 9 < 4
a: [0, 1, 2, 5, 4, 9]
j: 3
a[j+1] < a[j]: 5 < 4
a: [0, 1, 2, 4, 5, 9]
j: 2
[0, 1, 2, 4, 5, 9]可以看到,核心還是第一步實現的邏輯(第二層循環);
當i從第一個數的坐標(0)便利到最後第二個數的坐標(len(a) -1 -1),j就從坐標i往回遍歷到坐標0;
然後用j+1坐標的值和前邊的j坐標的值作對比,如果小於,就挪到前邊,不小於就跳出;
這樣插入的邏輯就從第一個數執行到最後一個數,整個排序算法就執行完了
python插入排序算法總結