在 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)
初学者:
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 + 1
的值覆盖位置 start
的值。然后我用 replacement
中的值覆盖位置 start + 1
的值,这是 numbers[start]
.
的旧值
有一种更有效的方法(无论如何在 python 中)交换数字,但对于初学者来说可能有点混乱。
但这不是唯一的问题。
您实现 BubbleSort 的方式是 "bubble up" 而不是 "bubble down"。这意味着在第一次通过之后,您现在知道最大的元素将在列表的末尾。
这意味着不是在第一次通过后将 start
增加 1,而是必须将 upper end 减少 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 无需临时变量即可进行交换,这使代码看起来更具可读性。
在这一行:
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) 并继续。您的下一个 if 语句 if numbers[start] > numbers[start+1] 然后尝试比较 if numbers[9] > numbers[10]。 Python 中的列表和数组索引从 0 开始,因此,当您尝试引用 numbers[10] 中的元素时,您引用的是列表中不存在的第 11 个值。这是一个常见的 "off by one" 错误,您在编程冒险中会经常遇到! :) 要更正此问题,只需将 while 循环更改为:
while start <= maxList:
使用具有一定迭代次数的 for loop
可能会造成浪费。它无法适应给出已排序数组的场景。 for loop
无论数组是否排序都会盲目迭代。
相反,我们应该引入一个标志并使用 while loop
。一旦检测到没有交换,就完成了。
我已经为家庭作业设置了冒泡排序,并且我一直在尝试使用 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)
初学者:
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 + 1
的值覆盖位置 start
的值。然后我用 replacement
中的值覆盖位置 start + 1
的值,这是 numbers[start]
.
有一种更有效的方法(无论如何在 python 中)交换数字,但对于初学者来说可能有点混乱。
但这不是唯一的问题。
您实现 BubbleSort 的方式是 "bubble up" 而不是 "bubble down"。这意味着在第一次通过之后,您现在知道最大的元素将在列表的末尾。
这意味着不是在第一次通过后将 start
增加 1,而是必须将 upper end 减少 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 无需临时变量即可进行交换,这使代码看起来更具可读性。
在这一行:
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) 并继续。您的下一个 if 语句 if numbers[start] > numbers[start+1] 然后尝试比较 if numbers[9] > numbers[10]。 Python 中的列表和数组索引从 0 开始,因此,当您尝试引用 numbers[10] 中的元素时,您引用的是列表中不存在的第 11 个值。这是一个常见的 "off by one" 错误,您在编程冒险中会经常遇到! :) 要更正此问题,只需将 while 循环更改为:
while start <= maxList:
使用具有一定迭代次数的 for loop
可能会造成浪费。它无法适应给出已排序数组的场景。 for loop
无论数组是否排序都会盲目迭代。
相反,我们应该引入一个标志并使用 while loop
。一旦检测到没有交换,就完成了。