[英]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
並且不需要del
和insert
。 了解這三行代碼的作用:我將位置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.