求N个8位数的中位数

时间:2015-09-08 11:19:08

标签: algorithm sorting median radix-sort median-of-medians

给定N个8位数字的数组(值0-255)?

如何找到中位数?

我尝试了基数排序和中位数算法的中位数。

如果数字的值在0到255之间,是否有更好的方法?

1 个答案:

答案 0 :(得分:5)

使用与counting sort类似的内容。

  • 创建"计数"大小为256的数组,初始化为所有0' 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

还有其他方法可以实现相同的时间和空间复杂度(尽管比上面复杂一点,并要求您修改输入数组):