Python 快速选择:什么&x27;怎么了?
我正在学习快速选择算法,但我的代码不起作用Python 快速选择:什么&x27;怎么了?,python,algorithm,Python,Algorithm,我正在学习快速选择算法,但我的代码不起作用 def qselect(li, k): if len(li) <= 1: return li mid = len(li) // 2 pivot = li[mid] left, equal, right = [], [], [] for number in li: if number < pivot: left.append(number)
def qselect(li, k):
if len(li) <= 1:
return li
mid = len(li) // 2
pivot = li[mid]
left, equal, right = [], [], []
for number in li:
if number < pivot:
left.append(number)
elif number > pivot:
right.append(number)
else:
equal.append(number)
if k < len(left):
qselect(left, k)
return left[k-1]
elif k < len(left) + len(equal):
return equal[0]
else:
qselect(right, k)
return right[k - len(left) - len(equal)]
li = [2, 36, 5, 21, 8, 13, 11, 20, 5, 4, 1]
k = 8
print(qselect(li,k))
所以,我希望正确的[0]被打印出来
怎么了?怎么了,你没有检查你要求的长度。调试此代码的第一件事是检查有问题的行中使用的值:
else:
qselect(right, k)
print("right", len(right))
print(k, len(left), len(equal), k - len(left) - len(equal))
return right[k - len(left) - len(equal)]
输出:
right 1
8 1 1 6
Traceback (most recent call last):
File "C:\Users\wdwickar\AppData\Local\Programs\Python\Python38\ZZZ learning\so.py", line 31, in <module>
print(qselect(li,k))
File "C:\Users\wdwickar\AppData\Local\Programs\Python\Python38\ZZZ learning\so.py", line 24, in qselect
qselect(right, k)
File "C:\Users\wdwickar\AppData\Local\Programs\Python\Python38\ZZZ learning\so.py", line 27, in qselect
return right[k - len(left) - len(equal)]
IndexError: list index out of range
右1
8 1 1 6
回溯(最近一次呼叫最后一次):
文件“C:\Users\wdwickar\AppData\Local\Programs\Python\Python38\ZZZ learning\so.py”,第31行,在
打印(qselect(li,k))
文件“C:\Users\wdwickar\AppData\Local\Programs\Python\Python38\ZZZ learning\so.py”,第24行,在qselect中
qselect(右,k)
文件“C:\Users\wdwickar\AppData\Local\Programs\Python\Python38\ZZZ learning\so.py”,第27行,在qselect中
向右返回[k-长度(左)-长度(相等)]
索引器:列表索引超出范围
请参阅此以获取进一步帮助。您希望得到什么结果?我以为原始列表中的第8个元素“13”已经打印出来了@l'l'lYou已经定义了
k
超过列表索引k=8
,它应该是k=7
,因为索引从0
开始。好吧,我有同样的想法,但它仍然返回相同的错误看一看:谢谢!我考虑过你的答案,但现在我想知道为什么len(右)和len(左)是1。我是否需要添加更多行以合并碎片列表?如果是这样,为什么第一个条件,如果kelse:
qselect(right, k)
print("right", len(right))
print(k, len(left), len(equal), k - len(left) - len(equal))
return right[k - len(left) - len(equal)]
right 1
8 1 1 6
Traceback (most recent call last):
File "C:\Users\wdwickar\AppData\Local\Programs\Python\Python38\ZZZ learning\so.py", line 31, in <module>
print(qselect(li,k))
File "C:\Users\wdwickar\AppData\Local\Programs\Python\Python38\ZZZ learning\so.py", line 24, in qselect
qselect(right, k)
File "C:\Users\wdwickar\AppData\Local\Programs\Python\Python38\ZZZ learning\so.py", line 27, in qselect
return right[k - len(left) - len(equal)]
IndexError: list index out of range