Python中的冒泡排序,这些参数有什么用?

0 投票
2 回答
6036 浏览
提问于 2025-04-18 01:02
def bbsort(list1):
    for passnum in range(len(list1)-1,0,-1):
        for i in range (passnum):
            if list1[i]>list1[i+1]:
                temp =list1[i]
                list1[i] = list1[i+1]
                list1[i+1] = temp

这是一个冒泡排序的代码,但在while条件中,-1,0,-1的作用是什么呢?

2 个回答

1

第一个 -1 是为了从输入列表的长度中减去 1,因为列表的索引是从 0 开始的,而不是从 1 开始的。0 是起始数字(这个数字只是为了帮助我们到达下一个参数)。第二个 -1 是步长,它告诉程序要反向遍历这个范围。

举个例子:
range(5, 2, -1) 的结果是 [5, 4, 3]

这相当于 range(起始, 结束, 步长)

9

你正在查看 range() 函数 的参数;这些数字设置了一个范围,从列表的长度减去一开始,然后逐步减少到1(这个范围的结束点是不包括在内的)。

这里有三个参数,第一个是 len(list1) - 1,第二个是 0,第三个是 -1

假设列表的长度是5,那么 range(5 - 1, 0, -1) 会生成一个包含4、3、2和1的列表:

>>> list(range(4, 0, -1))
[4, 3, 2, 1]

接下来,for 循环会遍历这些值:

>>> for i in range(4, 0, -1):
...     print(i)
... 
4
3
2
1

在这个 for 循环中,会把这些数字赋值给 passnum,然后下一个嵌套的循环会用这个值来创建一个新的 range()。第一次,这个内部范围会从 0len(list1) - 1(不包括这个值),下一次会从 0len(list1) - 2,依此类推,直到最后一次,它会从 01,总是排除结束的索引。对于一个长度为5的列表来说,内部循环第一次会把0、1、2、3赋值给 i,然后是0、1、2,再然后是0、1,最后是0。

这段代码错过了一个机会,可以利用Python的序列赋值来交换两个元素:

def bbsort(list1):
    for passnum in range(len(list1) - 1, 0, -1):
        for i in range (passnum):
            if list1[i] > list1[i + 1]:
                list1[i], list1[i + 1] = list1[i + 1], list[i]

撰写回答