给定N个8位数字的数组(值0-255)?
如何找到中位数?
我尝试了基数排序和中位数算法的中位数。
如果数字的值在0到255之间,是否有更好的方法?
答案 0 :(得分:5)
使用与counting sort类似的内容。
counts[x]
将是x
出现在输入数组中的次数。counts[input[i]]++
)。使用O(n)
空格(渐近最优)在O(1)
时间运行。
类似于:(伪代码)
// Count the number of occurrences of each value.
counts[256] = {0}
for i = 0 to input.length
counts[input[i]]++
// Get the median.
count = input.length
sum = 0
if count divisible by 2
first = NaN
for i = 0 to counts.length
sum += counts[i]
if first == NaN && sum >= count / 2
first = i
if sum >= count / 2 + 1
median = (first + i) / 2
break
else
for i = 0 to counts.length
sum += counts[i]
if sum >= (count + 1) / 2
median = counts[i]
break
return median
还有其他方法可以实现相同的时间和空间复杂度(尽管比上面复杂一点,并要求您修改输入数组):
A variant of quick sort通过在每一步将数组拆分为3而不是2来优化重复值(较小,相等和较大的值)。
The median of medians algorithm实际上也分享了这种复杂性。