在Python中使用while循环的冒泡排序

2024-10-01 09:18:05 发布

您现在位置: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)

当我运行这个程序时,它将对前几个有效,然后将不同的数字替换为我想要的,然后返回一个错误 索引器错误:列表索引超出范围 有什么想法吗?在

编辑的代码

^{pr2}$

Tags: inputlenifstartnuminsertprintdel
3条回答

对于初学者:

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

这看起来是一种很麻烦的交换两个数字的方法。试试这个方法:

^{pr2}$

不需要del和{}。理解这三行的作用:我将位于start的值放入变量replacement。然后我用位置start处的值覆盖start + 1处的值。然后我用replacement中的值覆盖start + 1位置的值,这是numbers[start]的旧值。在

还有一种更有效的交换数字的方法(无论如何,在python中),但是对于初学者来说可能会有点困惑。在

但这并不是唯一的问题。在

实现BubbleSort的方法是“向上冒泡”,而不是“冒泡”。这意味着在第一次传递之后,您现在知道最大的元素将位于列表的末尾。在

这意味着在第一次通过后,不是将start增加1,而是必须将结尾减少1。在

在这条特殊的线路上:

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

数字[start+1]引用的是列表中不存在的元素(数组边界之外)。在

^{pr2}$

在这行代码中,您将向列表中添加数字,直到列表长度等于最大长度。假设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(开始!=maxList)并继续。下一个if语句if numbers[start]>;numbers[start+1]然后尝试比较if numbers[9]>;numbers[10]。Python中的列表和数组索引从0开始,因此,当您试图引用位于数字[10]的元素时,您引用的是列表中不存在的第11个值。这是一个常见的“逐个关闭”错误,您将在您的编程冒险中经常遇到!:)要更正此问题,只需将while循环更改为:

while start <= maxList:

气泡排序算法在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不需要临时变量就可以进行交换,这使得代码看起来更具可读性。在

相关问题 更多 >