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中拉出的。对不起。我也应该说我不完全理解选择,我只是在尝试一些我在网上读到的东西。