我正在练习用不同语言编写各种排序函数。我使用递归调用在python中编写了一个冒泡排序,但我不知道如何正确终止递归。正如我现在所说,程序正确排序但超出了我的列表参数并触发错误:IndexError:列表索引超出范围(第29行)[即冒泡(randomList)]
import random
#create a list of 10 random ints between 0-99 to be sorted
def makeRandomList():
unsortedList=[]
for i in range(10):
unsortedList.append(random.randrange(100))
print unsortedList
return unsortedList
def bubblesort(randomList):
i=0
while i<=len(randomList):
if randomList[i] > randomList[i+1]:
randomList[i], randomList[i+1] = randomList[i+1], randomList[i]
i+=1
if i<len(randomList):
bubblesort(randomList)
else: break
else:
i+=1
#for testing purposes
print randomList
return randomList
randomList=makeRandomList()
sortedList=bubblesort(randomList)
print "sorted list: ", sortedList
答案 0 :(得分:1)
此错误是根据最初发布的代码编辑的。
这条线是否符合您的期望?
randomList[-i]<[-(i+1)]
这里只是将元素randomlist[-i]
与[ - (i + 1)]进行比较。 [ - (i + 1)]只是一个整数,而不是randomlist
的元素。它应该读
randomList[-i]<randomlist[-(i+1)]
如果您要比较列表中的元素。
创建大小为10的随机列表的更有效方法:
创建未排序的整数列表时,请利用random.sample()
,这样就不会浪费时间和空间。在您的情况下,random.sample(range(100), 10).
答案 1 :(得分:1)
我解决了我的问题。我的索引在列表的末尾运行(也就是说,当我是len(randomList)时,我的程序正在寻找len(randomList + 1)并且它没有在基本情况下终止,因为那时while循环是i&lt ; = len(randomList)当它应该是i&lt;(len(randomList)-1)。这是正确的解决方案:
def bubblesort(randomList):
i=0
while i<(len(randomList)-1):
if randomList[i] > randomList[i+1]:
randomList[i], randomList[i+1] = randomList[i+1], randomList[i]
i+=1
if i<(len(randomList)-1):
bubblesort(randomList)
else: break
else:
i+=1
print randomList
return randomList
答案 2 :(得分:0)
您的inOrder
功能不起作用。我是一个作用于函数的变量,因此在开头设置i + = 1表示它不会被设置为下一个递归调用中的那个。
答案 3 :(得分:0)
你可以用它来增加你的递归通话量:
sys.setrecursionlimit(10000)
我还建议你试图避免使用递归方法,因为你有。
您应该遍历列表以获得最小值和最大值,然后尝试预测值的位置。因此,如果列表中的所选项目小于100,则将其置于位置10。 或者你可以检查它之前的值是否大于或小于它,如果它小于它,那么它会在它之后的值:):例如:
Age = [10,11,20,9,10,2,1,3]
for X in range(0, len(Age)):
if X < len(Age) - 1:
if Age[X] > Age[X + 1]:
Temp = Age[X + 1]
Age[X + 1] = Age[X]
Age[X] = Temp
print(Age)
输出为:[10, 11, 9, 10, 2, 1, 3, 20]
你希望有一个while循环围绕for循环:)