[英]Insertion Sort in Python with for loops
我正在從 web 源學習 Python,它使用 for 循環和 while 循環的組合實現了插入排序算法。 我想自己練習代碼,我只使用 for 循環編寫了一個算法。 我需要一些關於我的代碼是否正確以及是否有效的反饋。
def insertionSort(lst):
for i in range(1,len(lst)):
temp = lst[i]
for j in range(0,i):
if lst[j] > temp:
lst[i], lst[j] = lst[j], lst[i]
return lst
lst = [8, 6, 4, 20, 24, 2, 10, 12]
print(insertionSort(lst))
output 是:[2, 4, 6, 8, 10, 12, 20, 24]
您的算法廣義上可以稱為插入排序,但它與通常理解的插入排序不同,因為它會將temp
值與之前的所有值進行比較,而標准插入排序只會將temp
與之前的較大值進行比較值,以及一個附加值,它將成為temp
的前身(如果有的話)。
這意味着您的實現的最佳情況時間復雜度為 O(²),而標准算法的最佳情況時間復雜度為 O()。 最好的情況發生在輸入已經排序的時候。
典型的插入排序算法將使內部循環向后進行,按降序訪問值,並在找到小於(或等於)要移動的值 ( temp
) 的值時停止。 在這個循環中,交換是用 2個連續的值完成的,這可以通過延遲插入temp
來改進,這樣值只需要向右復制一個位置,直到找到插入點。
Python 中的實現可能如下所示:
def insertionSort(lst):
for i, temp in enumerate(lst):
for j in range(i - 1, -1, -1):
if lst[j] <= temp: # Found insertion point?
lst[j + 1] = temp
break
lst[j + 1] = lst[j] # Make room for temp
else: # temp is the least value so far: insert at the start
lst[0] = temp
return lst
要測試您的實現是否正確地對列表進行排序,您可以用隨機輸入轟炸您的 function。 例如像這樣:
import random
for size in range(100):
lst = list(range(size))
random.shuffle(lst)
finallist = lst[:]
insertionSort(finallist)
if finallist != sorted(finallist):
print("Not sorted correctly:", lst, "to", finallist)
break
else:
print("All tests passed successfully")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.