Python 用选择算法求未排序列表的中值
我有一个整数列表,我想用选择来找到这个未排序列表的中间值。这是到目前为止我所拥有的,但是我没有得到任何测试列表的输出Python 用选择算法求未排序列表的中值,python,algorithm,sorting,search,Python,Algorithm,Sorting,Search,我有一个整数列表,我想用选择来找到这个未排序列表的中间值。这是到目前为止我所拥有的,但是我没有得到任何测试列表的输出[140240180400340]。有人能解释一下需要做什么才能得到中间值吗 我的代码 def fastSelect(aList, k): count = 0 pivot = 0 smallerList = [] largeList = [] while aList != []: pivot == len(aList)//2
[140240180400340]
。有人能解释一下需要做什么才能得到中间值吗
我的代码
def fastSelect(aList, k):
count = 0
pivot = 0
smallerList = []
largeList = []
while aList != []:
pivot == len(aList)//2
for i in range(0,pivot):
smallerList.append(aList[i])
for j in range(pivot + 1,len(aList)):
largeList.append(aList[j])
for g in range(0,len(aList)):
if aList[g] == pivot:
count += 1
m = len(smallerList)
if k >= m and k < m + count:
return pivot
if m > k:
aList = smallerList
else:
k = k - m - count
aList = largeList
def快速选择(列表,k):
计数=0
枢轴=0
smallerList=[]
largeList=[]
尽管如此!=[]:
pivot==len(aList)//2
对于范围内的i(0,轴):
smallerList.append(列表[i])
对于范围内的j(轴+1,透镜(列表)):
largeList.append(aList[j])
对于范围(0,len(aList))中的g:
如果aList[g]==枢轴:
计数+=1
m=len(小列表)
如果k>=m且kk:
aList=smallerList
其他:
k=k-m-计数
好色之徒
您实际上并不是在与您的pivot
值进行比较。您还有一个bug,您正在使用==
而不是=
来分配轴
初始化
def fastSelect(aList, k):
while aList:
smallerList = []
largeList = []
count = 0
pivot = aList[len(aList) // 2]
for i in aList:
if i < pivot:
smallerList.append(i)
elif i > pivot:
largeList.append(i)
else:
count += 1
m = len(smallerList)
if k >= m and k < m + count:
return pivot
if m > k:
aList = smallerList
else:
k = k - m - count
aList = largeList
def快速选择(列表,k):
尽管如此:
smallerList=[]
largeList=[]
计数=0
pivot=aList[len(aList)//2]
对于我来说:
如果我想:
smallerList.append(i)
elif i>枢轴:
largeList.append(一)
其他:
计数+=1
m=len(小列表)
如果k>=m且kk:
aList=smallerList
其他:
k=k-m-计数
好色之徒
要理解为什么pivot
成为中间值,您需要考虑中间值的定义。中值是列表中小于或等于其他值一半且大于或等于其他值一半的值
第一次通过循环时,选择中间值作为轴。然后,它将列表拆分为两个列表:一个包含小于轴的值,另一个包含大于轴的值。类似地,保持与轴相同的值的计数
。接下来,它将查看每个列表中有多少个值。如果两个列表大小相同或在count
的差异范围内,则根据定义,我们找到了中间值,因此我们返回pivot
所以现在我们必须在整个循环中保持不变。让我们看看每个案例。如果smallerList
(表示为m
)的大小大于k
,则中间值必须在smallerList
内,我们仍在寻找smallerList
内的kth
元素。如果k
大于m
,则中位数必须在largeList
内,但我们不再需要largeList
内的kth
元素,因为我们已经发现m
和计数小于或等于pivot
的元素,因此,在继续循环之前,我们从k
中减去这些
最后,您实际上可以通过使用随机轴心来改进此代码。如果你看维基百科上的文章,你会发现随机轴心保证了几乎一定的线性时间复杂性,而你选择的中间位置轴心有更可预测的最坏情况分析。你为什么期望输出?缩进是关闭的,您不会返回任何内容。缩进是从IDE中拉出的。对不起。我也应该说我不完全理解选择,我只是在尝试一些我在网上读到的东西。