三个中间位置,

时间:2016-10-17 00:13:47

标签: python quicksort

我正在寻找三个的中位数,将其用于QuickSort中的一个数据透视表。我不想导入任何统计库,因为我认为它会产生一些开销,我希望尽可能减少它。

def median(num_list):

if (num_list[0] > num_list[len(num_list) - 1]) and (num_list[0] < num_list[int(len(num_list)//2)]):
    return num_list[0]
elif (num_list[int(len(num_list)//2)] > num_list[len(num_list) - 1]) and (num_list[0] > num_list[int(len(num_list)//2)]):
    return num_list[int(len(num_list)//2)]
else:
    return num_list[len(num_list) - 1]

这似乎每次都会返回最后一句话,我很难过......

3 个答案:

答案 0 :(得分:1)

让Python为您完成工作。对三个元素进行排序,然后返回中间元素。

def median(num_list):
    return sorted([num_list[0], num_list[len(num_list) // 2], num_list[-1]])[1]

答案 1 :(得分:1)

在Quicksort中你通常不想只知道三个的中位数,你想要排列三个值,所以最小的是在一个点,中位数在另一个点,而最大值在另一个点。但如果你真的只想要三个中位数,这里有两种方式,另外一种方法可以重新排列。

这是查找abc的中位数的简短方法。

return a + b + c - min(a, b, c) - max(a, b, c)

如果您只想进行比较,并获得可能是最快的代码,请认识到可能需要执行三次比较,但您只想尝试两次。 (两个比较可以处理四个案例,但有三个对象有六个安排。)尝试

if a < b:
    if b < c:
        return b
    elif a < c:
        return c
    else:
        return a
else:
    if a < c:
        return a
    elif b < c:
        return c
    else:
        return b

如果您要重新排列值a <= b <= c

if a > b:
    a, b = b, a
if b > c:
    b, c = c, b
if a > b
    a, b = b, a
return b

答案 2 :(得分:1)

使用minmax

>>> numlist = [21, 12, 16]
>>> a, b, c = numlist
>>> max(min(a,b), min(b,c), min(a,c))
16
>>> 

走出困境 - 我有一个功能连胜,所以这里是itertools的等价物,即使它意味着导入一个模块

>>> import itertools
>>> numlist = [21, 12, 16]
>>> z = itertools.combinations(numlist, 2)
>>> y = itertools.imap(min, z)
>>> max(y)
16