笔者在 HackerRank 上的 SQL 编程挑战看到这题,有 96% 的提交成功率。实际上,使用 SQL 求中位数并不简单。
问题描述
我们先来看关于“中位数”的解释:
中位数(Median)又称中值,统计学中的专有名词,是按顺序排列的一组数据中居于中间位置的数,代表一个样本、种群或概率分布中的一个数值,其可将数值集合划分为相等的上下两部分。对于有限的数集,可以通过把所有观察值高低排序后找出正中间的一个作为中位数。如果观察值有偶数个,通常取最中间的两个数值的平均数作为中位数。
再来看几个具体的例子:
对于 “1,2,3,4,5” ,总共有 5 个数,居中的数是 3 ,因此这组数据的中位数是 3 。
对于“1,2,3,4,5,6”,共有 6 个数,居中的是 3 和 4,因此这组数的中位数是 3 和 4 的平均数 3.5 。
对于“3,3,3,3,100,100,100”,总共有 7 个数,居中的是 3,因此 3 是这组数据的中位数。
解决方案
解决方案主要有两种,第一种方案是对数据按大小排序后找到居中的值,再求值的平均数;第二种解决方案计算出每个数与其它数的相对位移(两数相减,结果为正则作 1,结果为负作 0,相等是 0),再对位移的结果加和,通常得到最小的加和结果的数就在居中的位置。
先来看比较简单的解决方案,也就是第一种。具体的做法是:
对给定的一组数据按从到大排序;
对排序后的数据编号,序号从 1 开始;
假设这组数据的总数是 N&#