我已經撰寫了這個“就地”作業的選擇排序演算法。我想對以下串列進行排序:[8,3,1,7,4,10,5,9,2,6]。當我運行演算法時,我得到以下輸出:[10, 2, 3, 4, 5, 6, 7, 8, 9, 10]。不幸的是,即使搜索了幾個小時,我也找不到錯誤。
def selectionSortInPlace(listToSort):
index = 0
for i in range(0, len(listToSort)):
value = listToSort[i]
index = 0
for j in range(i 1, len(listToSort)):
print(j)
if listToSort[j] < value:
value = listToSort[j]
index = j
temp = listToSort[i]
listToSort[i] = value
listToSort[index] = temp
unsortedList = [8,3,1,7,4,10,5,9,2,6]
selectionSortInPlace(unsortedList)
print(unsortedList)
uj5u.com熱心網友回復:
您的錯誤是您設定了index = 0andvalue = listToSort[i]并繼續進行交換,即使for回圈沒有更新這些值。
解決此問題的一種方法是將這些值設定為None,然后如果它們沒有實際值則繼續回圈:
def selectionSortInPlace(listToSort):
for i in range(0, len(listToSort)):
value = None
index = None
for j in range(i 1, len(listToSort)):
print(j)
if listToSort[j] < value:
value = listToSort[j]
index = j
if index is None:
continue
temp = listToSort[i]
listToSort[i] = value
listToSort[index] = temp
另一個選項是設定index = i,以便value即使for回圈從不更新也保持同步(在這種情況下,這只會使交換成為無操作):
def selectionSortInPlace(listToSort):
for i in range(0, len(listToSort)):
index = i
value = listToSort[i]
for j in range(i 1, len(listToSort)):
print(j)
if listToSort[j] < value:
value = listToSort[j]
index = j
temp = listToSort[i]
listToSort[i] = value
listToSort[index] = temp
您可以通過使用enumerate(它可以讓您自動迭代索引和值,而不必按索引迭代然后查找值)和元組分配(它可以讓您在沒有temp多變的):
def selectionSortInPlace(listToSort):
for i, a in enumerate(listToSort):
k = i
for j, b in enumerate(listToSort[i 1:], i 1):
if b < a:
k, a = j, b
listToSort[i], listToSort[k] = listToSort[k], listToSort[i]
您可以使用該函式使其更簡單min,因為它會自動進行內部迭代以找到最小值:
def selectionSortInPlace(listToSort):
for i in range(len(listToSort)):
j, _ = min(enumerate(listToSort[i:], i), key=lambda j_: j_[1])
listToSort[i], listToSort[j] = listToSort[j], listToSort[i]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/482689.html
