簡體   English   中英

使用 for 循環在 Python 中插入排序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM