我已经为家庭作业设置了一个冒泡排序,我一直在尝试使用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)
当我运行这个程序时,它将对前几个有效,然后将不同的数字替换为我想要的,然后返回一个错误 索引器错误:列表索引超出范围 有什么想法吗?在
编辑的代码
^{pr2}$
对于初学者:
这看起来是一种很麻烦的交换两个数字的方法。试试这个方法:
^{pr2}$不需要}。理解这三行的作用:我将位于
del
和{start
的值放入变量replacement
。然后我用位置start
处的值覆盖start + 1
处的值。然后我用replacement
中的值覆盖start + 1
位置的值,这是numbers[start]
的旧值。在还有一种更有效的交换数字的方法(无论如何,在python中),但是对于初学者来说可能会有点困惑。在
但这并不是唯一的问题。在
实现BubbleSort的方法是“向上冒泡”,而不是“冒泡”。这意味着在第一次传递之后,您现在知道最大的元素将位于列表的末尾。在
这意味着在第一次通过后,不是将
start
增加1,而是必须将上结尾减少1。在在这条特殊的线路上:
数字[start+1]引用的是列表中不存在的元素(数组边界之外)。在
^{pr2}$在这行代码中,您将向列表中添加数字,直到列表长度等于最大长度。假设maxList等于10。一旦列表退出此循环,它将包含10个元素。在
在这个while循环中,遍历数组的每个元素,并每次递增start变量。如果maxList等于10,一旦start=9,while循环求值为9!=10(开始!=maxList)并继续。下一个if语句if numbers[start]>;numbers[start+1]然后尝试比较if numbers[9]>;numbers[10]。Python中的列表和数组索引从0开始,因此,当您试图引用位于数字[10]的元素时,您引用的是列表中不存在的第11个值。这是一个常见的“逐个关闭”错误,您将在您的编程冒险中经常遇到!:)要更正此问题,只需将while循环更改为:
气泡排序算法在O(n*n)时间内相互作用repeatedly swapping adjacent elements,以保证排序顺序。其广受欢迎的带有两个for循环的公开形式可以很容易地修改为while循环,如下所示:
Python不需要临时变量就可以进行交换,这使得代码看起来更具可读性。在
相关问题 更多 >
编程相关推荐