2 回答

TA貢獻(xiàn)1719條經(jīng)驗(yàn) 獲得超6個(gè)贊
您在算法中看到的是選擇排序。這是您提出的第二個(gè)解決方案(嵌套for循環(huán)):
def insertion_sort(arr):
l = len(arr)
for i in range(l-1, -1, -1):
m = -10000 # it should be lower than min(arr)
idx = -1
for key, val in enumerate(arr[:i+1]):
if m < val:
m = val
idx = key
if idx != -1:
arr[i], arr[idx] = arr[idx], arr[i]
return arr
快速測(cè)試:
arr = list(range(10))[::-1]
print(arr)
# prints [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
result = insertion_sort(arr)
print(result)
# prints [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

TA貢獻(xiàn)2021條經(jīng)驗(yàn) 獲得超8個(gè)贊
這看起來像一個(gè)(相當(dāng)慢的)排序算法——即冒泡排序。它從列表的末尾迭代lst。然后它在第一個(gè)n-1元素中搜索最大值,并將它們與末尾交換。但是,如果最大值已經(jīng)在末尾,它將失敗,因?yàn)樗鼘⒆詣?dòng)max(n-1)與該n值交換。您需要為此添加支票。
因此,乍一看,我不確定是否i在之前定義過,但讓我們假設(shè)它是在 list 的長(zhǎng)度上定義的lst,看起來是這樣。所以讓我們從外部循環(huán)開始 - 因?yàn)橛幸粋€(gè)看起來像是從i0倒計(jì)時(shí)的 while 循環(huán)。這與遞增的 for 循環(huán)相反,因此我們可以創(chuàng)建一個(gè)保留范圍:
rev_range = range(0,len(lst))
rev_range.reverse()
for j in rev_range:
# perform the sort
我們現(xiàn)在有了用于倒計(jì)時(shí) while 循環(huán)的外部循環(huán)。排序本身向前迭代,直到找到最大值。這是一個(gè)前向 for 循環(huán)。
# sorting
max_val_so_far_index=lst[j]
# lst[:j-1] gets the first j-1 elements of the list
for k in lst[:j-1]:
if lst[k] > lst[max_val_so_far_index]:
max_val_so_far_index = k
# now we have the index of the maximum value
# swap
temp = lst[j]
lst[j] = lst[max_val_so_far_index]
lst[max_val_so_far_index]=temp
讓我們把這兩個(gè)組件放在一起得到:
rev_range = range(0,len(lst))
rev_range.reverse()
for j in rev_range:
# perform the sort
# sorting
#print j
max_val_so_far_index=j
# get the first j items
for k in range(j):
if lst[k] > lst[max_val_so_far_index]:
max_val_so_far_index = k
# now we have the index of the maximum value
# swap
temp = lst[j]
lst[j] = lst[max_val_so_far_index]
lst[max_val_so_far_index]=temp
最后lst是排序的。
添加回答
舉報(bào)