插入排序法類似打牌時候摸撲克牌整理順序的過程,邏輯如下:
- 在第i輪通過列表的時候(i從1到n-1),第i項應該插入到列表的前i個項中的正確位置;
- 在第i輪之後,前i個項應該是排好序的;
def insertion_sort(x):
i = 1
while i < len(x):
# i輪之前的最大的索引位置
j = i - 1
# 定義i輪時的值
item = x[i]
# 如果x[i]初始值小於前面的某個數:則該數往後移一位
# 同時x[i]再往前挪一個單位進行比較
while j >= 0 and item < x[j]:
x[j + 1] = x[j]
j -= 1
# 當j循環結束了或者和前面某個數進行比較時,x[i]不小於比較的數,比較結束
# 因爲j在上輪結束時,執行了減1,所以還得加回來1個單位
x[j + 1] = item
i += 1
return x
插入排序對於幾乎已經排好序的數據操作時,效率很高, 但平均來說,插入排序很低效,因爲插入排序每次只能將數據移動一位,希爾排序是在此基礎上對於插入排序的一種改進。
希爾算法的邏輯:
- 先將整個待排序的記錄序列分割成爲若干子序列分別進行直接插入排序,
- 待整個序列中的記錄“基本有序”時,再對全體記錄進行依次直接插入排序。
具體步驟如下:設定一個較大間隔gap,對所有間隔爲gap的數據通過插入排序法進行排序;執行完之後根據某種邏輯縮小gap(代碼中採用除以3取整的辦法),重複上述過程,直到gap = 0。
def hash_sort(x):
gap = round(len(x)*2/3)
while gap > 0 :
i = gap
while i < len(x):
j = i - gap
item = x[i]
while j >= 0 and item < x[j]:
x[j + gap] = x[j]
j -= gap
x[j + gap] = item
i += 1
gap = round(gap/3)
return x