三的中位数,枢轴

Median of three, pivot

我正在寻找三个 的 中位数,将其用作快速排序中的主元。我不想导入任何统计库,因为我相信它会产生一些开销,我希望尽可能减少。

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]

这似乎每次都返回最后一个else语句,我很难过...

让 Python 为您完成这项工作。对三个元素进行排序,然后 return 中间的一个。

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

在快速排序中,您通常不想只知道三个值的中位数,您希望排列三个值,使最小值在一个位置,中值在另一个位置,最大值在另一个位置。但如果你真的只想要三的中位数,这里有两种方法,再加上另一种重新排列的方法。

这是求 abc 的中位数的简便方法。

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

如果您只想进行比较,并且要获得可能是最快的代码,请注意可能需要执行三个比较,但您只想尝试两个。 (两次比较可以处理四种情况,但是三个对象有六种排列方式。) Try

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

使用 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