Python中的冒泡排序,这些参数有什么用?
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()
。第一次,这个内部范围会从 0
到 len(list1) - 1
(不包括这个值),下一次会从 0
到 len(list1) - 2
,依此类推,直到最后一次,它会从 0
到 1
,总是排除结束的索引。对于一个长度为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]