簡體   English   中英

在Python中使用while循環進行冒泡排序

[英]Bubble Sort using a while loop in Python

我已經為作業設置了冒泡排序,並且我一直在嘗試使用while循環。 我知道for循環是有可能的,但是我不太了解它們,我想寫一些我理解的東西。

unsorted = True
numbers = []
unsortchecker = 0
start = 0
maxlist = int(input("How many numbers should be sorted?"))
if len(numbers) == 1:
   print(1)
while len(numbers) < maxlist:
    num = input("Please enter a number: ")
    numbers.append(num)
while unsorted:
    if unsortchecker == 0:
        unsorted = False
    while start != maxlist:
        if numbers[start] > numbers[start+1]:
            replacement = numbers[start]
            replaced = numbers[start+1]
            del numbers[start]
            del numbers[start+1]
            numbers.insert(start, replaced)
            numbers.insert(start+1, replacement)
            unsortchecker = 1
            start = start + 1
            print(numbers)
      else:
          start = start + 1
          print(numbers)
print(numbers)

當我運行此命令時,它將在前幾個工作,然后將不同的數字替換為我想要的數字,然后返回錯誤IndexError:列表索引超出范圍任何想法?

編輯代碼

unsorted = True
numbers = []
unsortchecker = 0
start = 0
maxlist = int(input("How many numbers should be sorted?"))
end = maxlist
if len(numbers) == 1:
    print(1)
while len(numbers) < maxlist:
    num = input("Please enter a number: ")
    numbers.append(num)
while unsorted:
    if unsortchecker == 0:
        unsorted = False
    start = 0
     while start < maxlist-1:
        if numbers[start] > numbers[start+1]:
            replacement = numbers[start]
            numbers[start] = numbers[start + 1]
            numbers[start + 1] = replacement
            unsortchecker = unsortchecker + 1
            start = start + 1
            print(numbers)
        else:
             maxlist = maxlist - 1
             print(numbers)
print(numbers)

冒泡排序算法通過重復交換相鄰元素以確保排序順序,在O(n * n)時間內工作。 它流行的帶有兩個for循環的公開形式可以很容易地修改為用while循環替換,如下所示:

def bubbleSort(l):
    i = 0
    while i<len(l):
        j = 0
        while j<len(l)-1:
            if l[j+1] < l[j]:
                l[j], l[j+1] = l[j+1], l[j]
            j += 1
        i += 1
    return l

Python允許在沒有臨時變量的情況下進行交換,這使代碼看起來更具可讀性。

對於初學者:

replacement = numbers[start]
replaced = numbers[start+1]
del numbers[start]
del numbers[start+1]
numbers.insert(start, replaced)
numbers.insert(start+1, replacement)

看起來這是一種非常麻煩的方式來交換兩個數字。 嘗試這種方式:

replacement = numbers[start]
numbers[start] = numbers[start + 1]
numbers[start + 1] = replacement

並且不需要delinsert 了解這三行代碼的作用:我將位置start處的值放入變量replacement 然后,我將位置start處的值覆蓋為位置start的值start + 1 然后我在覆蓋位置處的值start + 1與所述值replacement ,這是舊值numbers[start]

有一種更有效的方式(無論如何,在python中)交換數字,但是對於初學者來說可能有些混亂。

但這不是唯一的問題。

實現BubbleSort的方式是“冒泡”而不是“冒泡”。 這意味着在第一遍之后,您現在知道最大的元素將在列表的末尾。

這意味着您不必在第一遍之后將start數增加1,而必須將上限減少1。

在這一行:

if numbers[start] > numbers[start+1]:

數字[開始+1]引用列表中不存在的元素(數組邊界之外)。

while len(numbers) < maxlist:
    num = input("Please enter a number: ")
    numbers.append(num)

在此代碼行中,您要向列表中添加數字,直到列表長度等於最大長度為止。 假設maxList等於10。一旦退出此循環,您的列表將包含10個元素。

 while start != maxList:
        if numbers[start] > numbers[start+1]:
        #extra code here
        start = start + 1

在此while循環中,您將遍歷數組的每個元素,並每次都遞增start變量。 如果說maxList等於10,則一旦start = 9,您的while循環將得出9!= 10(start!= maxList)並繼續。 您的下一個if語句if數字[開始]>數字[開始+1]然后嘗試比較數字[9]>數字[10]。 Python中的列表和數組索引從0開始,因此,當您嘗試引用數字[10]時,您將引用列表中的第11個值,該值不存在。 這是您在編程冒險中經常遇到的常見的“一對一”錯誤! :)要更正此問題,只需將您的while循環更改為:

while start <= maxList:

使用具有一定迭代次數的for loop可能很浪費。 它無法適應給定已排序數組的情況。 無論數組是否排序, for loop都會盲目地進行迭代。

相反,我們應該引入一個標志並使用while loop 一旦檢測到沒有交換,就完成了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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