我有一些小python代码,用于实现所讨论的quickselect here。
import random
def Quickselect(A, k):
if not A:
return
pivot = random.choice(A)
i = 0
A1 = []
A2 = [] # Two new arrays A1, A2 to store the split lists
for i in range(len(A)):
if A[i] < pivot :
A1.append(A[i])
else:
A2.append(A[i])
if k < len(A1):
return Quickselect(A1, k)
if k > len(A) - len(A2):
return Quickselect(A2, k-(len(A) - len(A2)))
else:
return pivot
pass
def main():
A = [45,1,27,56,12,56,88]
print(Quickselect(A,2))
pass
我似乎得到了一个randrange错误。有什么不对劲吗?
修改:已实施random.choice
而不是random.randint
。
上面的代码似乎工作正常。感谢用户Blender。
答案 0 :(得分:1)
您的错误发生是因为randrange
在范围为空(即randrange(1, 1)
)时中断。
改为使用random.choice
并将k <= len(A1)
更改为k < len(A1)
:
def quick_select(A, k):
pivot = random.choice(A)
A1 = []
A2 = []
for i in A:
if i < pivot:
A1.append(i)
elif i > pivot:
A2.append(i)
else:
pass # Do nothing
if k <= len(A1):
return Quickselect(A1, k)
elif k > len(A) - len(A2):
return Quickselect(A2, k - (len(A) - len(A2)))
else:
return pivot