Bubblesort通过> 1无效吗?

时间:2018-07-21 08:57:42

标签: python

我在Python中有以下程序用于冒泡排序,该程序将通过次数和未排序列表作为输入:

def bubblesort(passnum,list=[]):
    for j in range (passnum):
        for i in range (len(list)):
            if list[i-1]<list[i]:
                continue
            elif list[i-1]>list[i]:
                temp=list[i]
                list[i]=list[i-1]
                list[i-1]=temp

list=[54,26,93,17,77,31,44,55,20]
passnum=int(input("Enter the number of passes\n"))
bubblesort(passnum,list)
print(list)

但是它在第一次通过时对列表进行排序,但在后续通过时不起作用。既然我还是Python的初学者,有人可以说出什么问题吗?

我得到了输出:

Enter the number of passes: 2 
[54,17,77,31,44,55,20,26,93] 

这意味着第一遍因为正确率最高的93而正确运行,但随后77应该早于93。

1 个答案:

答案 0 :(得分:1)

首先,如@roganjosh所说

  • 我们应该避免将默认参数设置为可变对象(仅在我们打算这样做的情况下(例如,用于某种类型的缓存)),而且永远不要使用此默认值,并使用默认的空容器运行sort当我们可以根据需要显式传递空list时,这没有任何意义,因此我们可以在此处删除默认参数,
  • 我们应该避免重复使用内置名称(它最终会导致无法预料的行为)。

使用Python,也可以在没有temp对象的情况下进行tuple交换。

关于您的问题:具有单个参数的range内置函数会从int0生成argument - 1个对象,因此在您的特定情况下是第一次迭代({{ 1}}),您正在比较

i = 0

在第二遍时变成list[-1] < list[0] (因为最后一个元素是False元素),所以我们要替换第一个和最后一个元素。

所以我们最终可以得到类似的东西

max

测试

def bubblesort(passnum, list_):
    for _ in range(passnum):
        for i in range(1, len(list_)):  # note that we are starting from 1 instead of 0
            if list_[i - 1] < list_[i]:
                continue
            elif list_[i - 1] > list_[i]:
                list_[i], list_[i - 1] = list_[i - 1], list_[i]

进一步阅读