冒泡排序的代码
第二行报错list out of range
def bubble(x):
for i in range(len(x)):
for j in range(len(x)-i):
if x[j] > x[j+1]:
x[j],x[j+1] = x[j+1],x[j]
return x
print(bubble([4,6,3,5,6,7,8,3,4,5]))
a = [2,3,4,5,6]
如上
但是当我把第二行改成for i in range(1,len(x))的时候结果是正确的,这两个有什么区别啊
后面我又多试了几次,好像只要第二行的range从0开始就会out of range
我想知道这是为什么,谢谢!
如果第二行的range从0开始,那么第一次循环时的i值为0,则第三行的len(x)-i就等于原列表长度(即len(x) == len(x)-i)。这种情况下,第四行的j+1就会大于x的最后一个索引。
总结一下,在第一次母循环(i=0)下的最后一次子循环(j=len(x)-1),j被赋值为len(x)-1,即x列表最大索引,此时j+1大于x列表最大索引,所以报错。
在这个程序中,你在第二行的 for 循环中使用的 range 函数的参数为 (len(x)),这导致了 "list out of range" 错误。
如果你希望在循环中遍历 x 列表的所有元素,应该使用 range 函数的参数为 (len(x)-1),以便在访问 x[j+1] 时不会越界。
def bubble(x):
for i in range(1, len(x)):
for j in range(len(x)-i):
if x[j] > x[j+1]:
x[j],x[j+1] = x[j+1],x[j]
return x
print(bubble([4,6,3,5,6,7,8,3,4,5]))
a = [2,3,4,5,6]
按照下述打印和注释,可以看出问题
def bubble(x):
for i in range(1,len(x)): #此处,修改为range从1开始即可
print(len(x),i) #此处当x=10时,i=0
for j in range(len(x)-i): #range轮询的是0-10
print(j) #list只有10个元素,所以当取x[10]时,超出了范围
if x[j] > x[j+1]:
x[j],x[j+1] = x[j+1],x[j]
return x
print(bubble([4,6,3,5,6,7,8,3,4,5]))
a = [2,3,4,5,6]