quantile_sorted.js

/**
 * 分位数计算内部实现(输入已排序数组时可避免重复排序,提升计算效率)
 *
 * @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;