[英]How exactly does the loop within a bubble sort algorithm work? (Python 3)
示例代碼:
def bubble_sort(my_list):
n = len(my_list)
for i in range(n):
for j in range(0, n - 1 - i):
if my_list[j] > my_list[j + 1]:
my_list[j], my_list[j + 1] = my_list[j + 1], my_list[j]
my_list = [94, 17, 5, 28, 7, 63, 44]
bubble_sort(my_list)
print(my_list)
在上面的代碼中,我對嵌套循環的 for for __ in range() 部分感到困惑。 這是做什么的,它是如何做到的? 另外, my_list[j], my_list[j+1] = my_list[j+1], my_list[j] 如何重新排列列表值? 抱歉,如果這聽起來很愚蠢,但我想了解我正在編寫的語法背后的邏輯,而且我找不到可以很好地解釋邏輯的地方,所以希望看到這個的人可以。 謝謝你的幫助!
好問題。 我將嘗試解決我在您的帖子中發現的兩個問題。
問題 1:對於 __ in range() 有什么作用? 范圍 function 只生成一個數字列表。 例如,假設 n = 5,則 range(5) 等於 range(n),這反過來生成 [0, 1, 2, 3, 4]。 該列表的長度為 5,其中 0 表示包含,5 表示排除。 由於列表在 python 中是可迭代的,因此 for 循環迭代列表。
例如:
for i in range(5): print(i, end=' ')
將打印 0 1 2 3 4
說了這么多,嵌套循環有什么作用呢? 嗯,首先要注意的是,在這種情況下,范圍從零 (0) 開始,這就是為什么你有range(0, ... 。真正令人困惑的是范圍 function 內的第二部分。為了要理解為什么會這樣,我們需要了解冒泡排序的行為方式。
以輸入列表為例:
my_list = [94, 17, 5, 28, 7, 63, 44]
冒泡排序會這樣排序:
[17, 5, 28, 7, 63, 44, 94]
[5, 17, 7, 28, 44, 63, 94]
[5, 7, 17, 28, 44, 63, 94]
[5, 7, 17, 28, 44, 63, 94]
[5, 7, 17, 28, 44, 63, 94]
[5, 7, 17, 28, 44, 63, 94]
[5, 7, 17, 28, 44, 63, 94]
現在,請注意冒泡排序組織列表的方式非常有趣。 所做的是取最大數並將其放在列表的末尾(94),然后取第二大數並將其按順序放在 94 旁邊(63),依此類推。 實際上,我們的列表包含兩個邊,有序邊和無序邊。 由於我們已經訂購了商品,因此沒有理由重復這些商品。 這就是為什么在表達式n - 1 - i中有 -i 的原因。
現在,您可能會問為什么要減去-1 。 原因是屬於第二個問題的交換。
問題 2:這(my_list[j], my_list[j + 1] = my_list[j + 1], my_list[j])如何重新排列我的項目?
上面的代碼等效於用其他語言執行此操作:
int temp = item[i];
item[i] = item[i + 1];
item[i + 1] = temp;
為了更好地理解這一點,我們需要了解變量在編程中是如何工作的。 顧名思義,變量就是他們所說的,變量,意味着它們的值可能會改變。 如果你給一個變量賦值,然后你給同一個變量賦值另一個值,之前的值將被清除。
由於我們需要將 item[i] 的值放在 item[i + 1] 中,這樣做是不正確的
item[i] = item[i + 1]
因為那我們怎么分配
item[i + 1] = item[i]
因為我們刪除了 item[i] 中的前一個值。 在這種情況下,采取的方法是使用一個時間變量來保存“容器”之一的值,以便我們成功地進行交換。 唯一的事情是 python 通過使用語法糖並讓程序員只需鍵入以下內容就可以進行值交換,從而完美地做到了這一點:
(my_list[j], my_list[j + 1] = my_list[j + 1], my_list[j])
總之,對於第二個問題,我們添加-1是因為我們想要交換最后一個和倒數第二個而不獲取IndexError 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.