问题遇到的现象和发生背景
alist = [2,1]
alist.insert(0,alist.pop(alist[1]))
print(alist)
#结果 [1,2]
def bubbleSort(alist):
for _ in range(len(alist)):
i = 0
while i < len(alist)-1:
if alist[i] > alist[i+1]:
print(i)
alist.insert(i,alist.pop(alist[i+1]))
#IndexError: pop index out of range 为什么会error呢
i += 1
return alist
mylist = [5,4]
print(bubbleSort(mylist))
报错的原因是pop(alist[i+1])里alist[i+1]为4,但是pop(4)没有这个索引。
抛开这个错误不谈,逻辑好像也有点问题,即使能交换位置,也会陷入死循环,你再检查一下?
你的alist.pop(alist[i+1])
这个肯定有问题啊,i为0的时候,你的alist[i+1]就是alist[1]就是4,那么alist.pop(4)肯定越界了
第一次循环的时候i=0,alist[i+1]返回的值是mylist中的第二个元素4,pop函数的入参是索引值,alist.pop(alist[i+1])实际上是alist.pop(4),肯定会报角标越界异常
代码应该不全吧,你把i+=1写进if里,不会死循环?
第一次循环,0和1交换了
你外层还有个for循环,所以会再次进入while,此时if不成立,那么i永远不变,标准死循环啊
def bubbleSort(arr):
n = len(arr)
# 遍历所有数组元素
for i in range(n):
# Last i elements are already in place
for j in range(0, n-i-1):
if arr[j] > arr[j+1] :
arr[j], arr[j+1] = arr[j+1], arr[j]
arr = [64, 34, 25, 12, 22, 11, 90]
bubbleSort(arr)
print ("排序后的数组:")
for i in range(len(arr)):
print ("%d" %arr[i]),
第7行: alist.pop(alist[i+1]) alist.pop(list的下标,而不是list的值)
可以改成 alist.insert(i, alist.pop(i+1))
感谢各位,忘了pop()应该是index了。