因為選擇排序將輸入串列分為兩部分:已排序項的子串列和未排序項的子串列,是否可以創建兩個不同的函式并將它們連接在一起?我已經完成了我的排序演算法,但我不知道如何拆分它們。
def selection_sort(l):
for i in range(len(l)):
start_index = i
for j in range(i 1, len(l)):
if l[start_index] > l[j]:
min_value = j
l[i], l[start_index] = l[start_index], l[i]
l = [64, 25, 12, 22, 11]
print(l)
我想要的是把它分成這個:
def min_index(l, start_index) & def selection_sort(l)
uj5u.com熱心網友回復:
首先,您提供的代碼不正確:
只有一個交換發生,無條件地,作為函式的最后一條陳述句。這當然不可能。對串列進行排序所需的交換次數取決于其順序。
第二個回圈從不迭代:
i已達到輸入的長度,因此range(i 1, len(i))是一個空范圍。的值
min_value從不使用。
前兩個問題可能是因為您以錯誤的方式復制了代碼,并且遺漏了一些必要的縮進。第二個問題是因為兩個不同的名字應該是同一個名字。
這是一個更正的版本:
def selection_sort(l):
for i in range(len(l)):
start_index = i
for j in range(i 1, len(l)):
if l[start_index] > l[j]:
start_index = j
l[i], l[start_index] = l[start_index], l[i]
現在回答您的問題:您確實可以將內部回圈的邏輯放入另一個函式中。像這樣:
def min_index(l, i):
for j in range(i 1, len(l)):
if l[i] > l[j]:
i = j
return i
def selection_sort(l):
for i in range(len(l)):
j = min_index(l, i)
l[i], l[j] = l[j], l[i]
uj5u.com熱心網友回復:
你的選擇排序有問題,所以我更正了它。簡而言之:
- 縮進不正確,因此回圈沒有嵌套(我認為這可能是由于此平臺上的格式問題而發生的)。
- 在你的內部回圈您測驗
start_index反對j,但更新min_value。 - 在
start_index用于交換的內回圈結束時。start_index總是等于i。
這是更正后的版本,其中一些變數重命名以便更好地閱讀。
def selection_sort(arr):
for i in range(len(arr)):
min_index = i
for j in range(i 1, len(arr)):
if arr[min_index] > arr[j]:
min_index = j
arr[i], arr[min_index] = arr[min_index], arr[i]
重構后的版本分為兩部分:
def selection_sort2(arr):
for i in range(len(arr)-1):
min_index = get_min_index(i, arr)
arr[i], arr[min_index] = arr[min_index], arr[i]
def get_min_index(i, arr):
min_index = i
for j in range(i 1, len(arr)):
if arr[min_index] > arr[j]:
min_index = j
return min_index
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/362205.html
