三的中位数,枢轴
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]
在快速排序中,您通常不想只知道三个值的中位数,您希望排列三个值,使最小值在一个位置,中值在另一个位置,最大值在另一个位置。但如果你真的只想要三的中位数,这里有两种方法,再加上另一种重新排列的方法。
这是求 a
、b
和 c
的中位数的简便方法。
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
使用 min
和 max
:
>>> 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
我正在寻找三个 的 中位数,将其用作快速排序中的主元。我不想导入任何统计库,因为我相信它会产生一些开销,我希望尽可能减少。
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]
在快速排序中,您通常不想只知道三个值的中位数,您希望排列三个值,使最小值在一个位置,中值在另一个位置,最大值在另一个位置。但如果你真的只想要三的中位数,这里有两种方法,再加上另一种重新排列的方法。
这是求 a
、b
和 c
的中位数的简便方法。
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
使用 min
和 max
:
>>> 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