/**
* 分位数计算内部实现(输入已排序数组时可避免重复排序,提升计算效率)
*
* @param {Array<number>} x 已排序数据样本(需包含至少一个数据点)
* @param {number} p 分位点:取值范围[0, 1]的数值
* @returns {number} 分位数值
* @throws {Error} 当p超出[0,1]范围时抛出错误
* @throws {Error} 当输入数组为空时抛出错误
* @example
* quantileSorted([3, 6, 7, 8, 8, 9, 10, 13, 15, 16, 20], 0.5); // => 9
*/
function quantileSorted(x, p) {
const idx = x.length * p;
// 输入有效性验证
if (x.length === 0) {
throw new Error("分位数计算需要至少一个数据点");
} else if (p < 0 || p > 1) {
throw new Error("分位点必须处于[0, 1]区间");
} else if (p === 1) {
// 边界情况处理:p为1时返回末位元素
return x[x.length - 1];
} else if (p === 0) {
// 边界情况处理:p为0时返回首位元素
return x[0];
} else if (idx % 1 !== 0) {
// 非整数索引情况:取向上取整位置的前一个元素
return x[Math.ceil(idx) - 1];
} else if (x.length % 2 === 0) {
// 偶数长度数组:取中间两个元素的平均值
return (x[idx - 1] + x[idx]) / 2;
} else {
// 奇数长度数组:直接返回中间位置元素
return x[idx];
}
}
export default quantileSorted;