簡體   English   中英

冒泡排序算法中的循環究竟是如何工作的? (Python 3)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM