我还没有找到任何简单的实现来查找数组的中位数。 bash 如何在不重新发明轮子的情况下做到这一点?
如果当前正在使用这个:
median() {
arr=$1
nel=${#arr[@]}
if (( $nel % 2 == 1 )); then # Odd number of elements
val="${arr[ $(($nel/2)) ]}"
else # Even number of elements
val="$(( ( arr[$((nel/2))] + arr[$((nel/2-1))] ) / 2 ))"
fi
printf "%d\n" "$val"
}
出于某种原因,我仍然无法弄清楚,它返回的值不正确,对于如此简单的事情来说,它似乎过于复杂。我觉得必须有一种方法可以在一行中完成此操作。
最佳答案
我想你想要这样的东西:
#!/bin/bash
median() {
arr=($(printf '%d\n' "${@}" | sort -n))
nel=${#arr[@]}
if (( $nel % 2 == 1 )); then # Odd number of elements
val="${arr[ $(($nel/2)) ]}"
else # Even number of elements
(( j=nel/2 ))
(( k=j-1 ))
(( val=(${arr[j]} + ${arr[k]})/2 ))
fi
echo $val
}
median 1
median 2 50 1
median 1000 1 40 50
示例输出
1
2
45
关于bash - 在一行BASH中获取未排序数组的中位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41750008/