我正在嘗試選擇排序演算法。有以下代碼:
def selectionSort(list):
for i in range(len(list)-1):
curr_min=i
for j in range(i 1, len(list)):
if list[j]<list[curr_min]:
curr_min=j
temp=list[curr_min]
list[curr_min]=list[i]
list[i]=temp
一般來說,我對 for 回圈有一些不明白的地方,我將嘗試從這個例子中提出問題。我了解演算法的作業原理。首先我們分配curr_min第一個索引[0]。然后 for 回圈遍歷下一個元素。假設它找到了一個小于第一個元素的元素。然后當前最小值將被分配該元素的索引。
假設我們有以下陣列: nums=[3, 5, 2, 4, 6, 1, 8]. 當前索引為零,元素為 3。內部 for 回圈開始迭代并找到 2。當前索引被分配 2(索引,而不是數字)。
然而,在那之后會發生什么?內部回圈是否會繼續迭代,它會在索引 5 處找到元素 1 并將該值分配給當前最小值?
或者內部回圈會停止并且外部回圈會增加,因此 curr_min變成1(第二個i)?我知道這種方式沒有意義,但是,我也看不出是什么阻止了它這樣做。
另一件事,假設前者發生并且 curr_min 被分配了 5 的值。(1 的索引)。為了curr_min保持這個值,那么外回圈必須停止對嗎?如果它繼續,那么curr_min將變為 1(第二個 i),因此我們在內回圈中所做的所有事情都變得無用。由于這段代碼作業正常,我假設這不會發生,但是我再一次看不到是什么阻止了外回圈繼續并將它自己的值分配給變數。
希望這聽起來不會太亂,而且很清楚我的問題是什么。非常感謝任何幫助,謝謝
uj5u.com熱心網友回復:
整個塊在外回圈的每次迭代中運行:
curr_min=i
for j in range(i 1, len(list)):
if list[j]<list[curr_min]:
curr_min=j
temp=list[curr_min]
list[curr_min]=list[i]
list[i]=temp
同樣對于外回圈的每次迭代,內回圈都會運行到完成。當該內回圈完成時,控制還沒有回傳到外回圈:首先完成該塊的其余部分。在這種情況下,就是這個代碼:
temp=list[curr_min]
list[curr_min]=list[i]
list[i]=temp
這些行將索引 i 處的元素與索引 curr_min 處的元素交換。之后,不再需要 curr_min。它的價值確實丟失了,并且在下一次迭代中使用了一個新的。沒問題,它已經完成了它的作業:指示要與索引 i 處的元素交換哪個元素。
也許嵌套回圈首先通過一個非常簡單的示例向您解釋,如下所示:
for x in range(0, 10):
for y in range(0, 20):
... # do something with x and y
在這種情況下,在內回圈完成后,控制確實回傳到外回圈,只是因為它之后什么都沒有。但實際發生的情況與往常一樣:每個塊在控制回傳到外部陳述句之前完全運行(在某些情況下除外:raise、continue、break、return)。
您可以使用 Python Tutor 單步執行代碼(向前和向后)并查看每時每刻發生的情況,以便更好地了解正在發生的事情:Python Tutor with your code
uj5u.com熱心網友回復:
回圈將繼續迭代,直到出現以下情況之一:
- 滿足回圈結束條件
- 例如 In
for i in range(x):,當 的所有元素range(x)都已被迭代時。
- 例如 In
- 執行
break運算式 - 引發例外
- 行程退出,例如
sys.exit() - 包含回圈的函式(如果有)回傳。
假設我們有以下陣列:nums=[3, 5, 2, 4, 6, 1, 8]。當前索引為零,元素為 3。內部 for 回圈開始迭代并找到 2。當前索引被分配 2(索引,而不是數字)。
然而,在那之后會發生什么?內部回圈是否會繼續迭代,它會在索引 5 處找到元素 1 并將該值分配給當前最小值?
內部回圈將繼續迭代。正如您所說,它將在索引 5 處找到元素 1 并將該值分配給當前最小值。
另一件事,假設前者發生并且 curr_min 被分配了 5 的值。(1 的索引)。為了讓 curr_min 保持該值,那么外部回圈必須停止對嗎?
外回圈不會停止。值得注意的是,外回圈增加了內回圈的起始索引。內部回圈從該索引開始查找剩余陣列中的最小值。
考慮外回圈的前兩次迭代。首先,內部回圈找到最小值 1 并將其交換到索引 0。陣列現在是[1, 5, 2, 4, 6, 3, 8]。這是一個進步,因為陣列的最小元素位于它應該在最終輸出中的開頭。我們現在可以忽略第一個值為 1 的元素,因為它在索引 0 處的正確位置。外回圈將內回圈的起始索引從 0 增加到 1。現在內回圈再次重復,在索引 0之后的陣列并將其交換到索引 1。陣列 then [1, 2, 5, 4, 6, 3, 8],所以我們再次取得了進展......前兩個元素是 1,2 在正確的位置。等等
uj5u.com熱心網友回復:
我建議將變數更改list為不同的名稱。List 是 Python 中的保留字,因此可能會導致一些問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/487583.html
上一篇:陣列不起作用的“如果陳述句”
下一篇:列的條件乘法
