我已经为quickSelect算法提供了以下伪代码。我对一些事情感到有些困惑,当我调用quickSelect方法时,我为'k'发送了什么。另外,因为我需要在方法的开头声明count = 0,所以在quickSelect的递归调用中它总是会被设置回0,这不是我需要发生的事情感谢你的帮助,我已经包含了Pseudo - 代码以及我的代码;
Function quickSelect(aList, k):
If aList is not empty:
pivot <- Choose the element at position (len(alist)//2)
smallerList <- All elements of aList smaller than pivot
largerList <- All elements of aList larger than pivot
count <- the number of occurences of pivot value in aList
m <- the size of smallerList
if k >= m and k < m + count then:
return pivot
if m > k:
return quickSelect(smallerList,k)
else:
return quickSelect(largerlist, k-m-count)
这就是我的想法:
def quickSelect(aList, k):
pivot = aList[len(aList)//2]
smallerList = aList[:pivot]
largerList = aList[pivot:]
m = len(smallerList)
count = 0
for i in aList:
if i == pivot:
count = count + 1
if k >= m and k < m + count:
return pivot
if m > k:
return quickSelect(smallerList, k)
else:
return quickSelect(largerList, k-m-count)
答案 0 :(得分:6)
首先,您有smallerList
和largerList
根据其索引从枢轴的任意一侧获取内容,而不是其值。 Pivot应该将数字除以索引的内容,而不是索引的位置(比如索引是5,小于5的所有条目都需要分配给smallerList
,所有数字都需要更大被分配给大于5的largerList
。
这可以通过简单的for循环来完成:
if len(aList)!=0:
pivot=aList[(len(aList)//2)]
smallerList = []
for i in aList:
if i<pivot:
smallerList.append(i)
largerList=[]
for i in aList:
if i>pivot:
largerList.append(i)
m=len(smallerList)
count=len(aList)-len(smallerList)-len(largerList)
smallerList
和largerList
将/不包括pivot,因此count(枢轴发生的次数)将是主列表的长度减去较小和较大列表的组合长度。
现在,如果k(第k个最小数字)大于或等于m,则较小列表的长度,AND k小于较小列表的长度+枢轴数,需要返回枢轴,因为它是你要找的第k个最小数字。
if k >= m and k<m + count:
return pivot
或者,如果较小列表的长度大于k,则仅使用smallerList
而不是完整列表再次快速选择。
elif m > k:
return quickSelect(smallerList,k)
否则,使用较大的列表而不是完整列表再次运行快速选择,并查找k - 较小列表的长度 - 枢轴数
else:
return quickSelect(largerList, k - m - count)
此函数将反复运行(比线性排序快得多),并且一旦满足就会返回枢轴。在这种情况下,枢轴将是中位数。
希望这有帮助!