在 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

并且不需要 delinsert。了解这三行的作用:我将位置 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。一旦检测到没有交换,就完成了。