我已经为家庭作业设置了泡泡排序,我一直在尝试使用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)
答案 0 :(得分:1)
冒泡排序算法在 O(n * n)时间内按repeatedly swapping adjacent elements相互作用以确保排序顺序。它的流行的公开形式有两个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允许在没有临时变量的情况下进行交换,这使得代码看起来更具可读性。
答案 1 :(得分:0)
首先:
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 + 1
的值。然后,我使用start + 1
中的值覆盖位置replacement
的值,这是numbers[start]
的旧值。
有一种更有效的方法(在python中,无论如何)交换数字,但对于初学者来说可能有点混乱。
但这不是唯一的问题。
你实施BubbleSort的方式是你“冒泡”而不是“泡沫化”。这意味着在第一次传递之后,您现在知道最大的元素将位于列表的末尾。
这意味着您不必在第一次传递后将start
增加1,而是必须将 upper 结尾减少1.
答案 2 :(得分:0)
在这一特定行:
if numbers[start] > numbers[start+1]:
numbers [start + 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)并继续。如果数字[开始]&gt;您的下一个if语句数字[start + 1]然后尝试比较数字[9]&gt;数[10]。 Python中的列表和数组索引从0开始,因此,当您尝试在数字[10]处引用元素时,您将引用列表中的第11个值,该值不存在。这是一个常见的&#34; off by one&#34;您在编程冒险中经常会遇到的错误! :)要纠正这个问题,只需将while循环更改为:
while start <= maxList:
答案 3 :(得分:-1)
使用for loop
进行一定数量的迭代可能会造成浪费。它无法适应给定已排序数组的情况。 for loop
会盲目地进行迭代,而不管数组是否已排序。
相反,我们应该引入一个标志并使用while loop
。一旦检测到没有交换,就完成了。