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

时间:2017-01-11 20:42:15

标签: python bubble-sort

我已经为家庭作业设置了泡泡排序,我一直在尝试使用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)

4 个答案:

答案 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

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