Javascript 中数组的中位数?

Median of an array in Javascript?

我正在尝试查找数组的中位数。 我做了很多研究,如果这个问题似乎被问了好几次,没有一个答案令人满意。

创建我的数组效果很好,但是当我调用函数时,数组已排序,但它 returns 不同的值,从 NaN 到数组的第一个值

如何找到长度的中值,然后从它的索引中找到数组的中值?

var ar1 = [];

while (true) {
  var enterValues = prompt("enter your values");
  if (enterValues != "") {
    ar1.push(enterValues);
  } else {
    break;
  }
}

function calcMedian() {
  
  var half = Math.floor(ar1.length / 2);
  ar1.sort(function(a, b) { return a - b;});

  if (ar1.length % 2) {
    return ar1[half];
  } else {
    return (ar1[half] + ar1[half] + 1) / 2.0;
  }
}

console.log(ar1);
console.log(ar1.length);
console.log(calcMedian());
console.log(ar1);

(ps:要停止填充数组,只需输入空值即可。)

您的代码有 2 个问题:

  1. 您在填充数组之前计算 half,因此它始终为 0。
  2. 您将数字保存为字符串,因此当您添加它们时,您不会得到正确的结果。

工作:

var ar1 = [];


while (true) {
  var enterValues = prompt("enter your values");
  if (enterValues != "") {
    ar1.push(+enterValues);
  } else {
    break;
  }
}

function calcMedian() {
  var half = Math.floor(ar1.length / 2);
  ar1.sort(function(a, b) { return a - b;});

  if (ar1.length % 2) {
    return ar1[half];
  } else {
    return (ar1[half] + ar1[half] + 1) / 2.0;
  }
}

console.log(ar1);
console.log(ar1.length);
console.log(calcMedian());
console.log(ar1);

var ar1 = [];

while (true) {
  var enterValues = prompt("enter your values");
  if (enterValues != "") {
    ar1.push(parseFloat(enterValues));
  } else {
    break;
  }
}

function calcMedian() {
  var half = Math.floor(ar1.length / 2);
  
  ar1.sort(function(a, b) { return a - b;});
  
  if (ar1.length % 2) {
    return ar1[half];
  } else {
    return (ar1[half-1] + ar1[half]) / 2.0;
  }
}

console.log(ar1);
console.log(ar1.length);
console.log(calcMedian());
console.log(ar1);

Math.floor(ar1.length)会return(例如)4就是长度是8。但是,如果您执行 ar1[4] 它实际上会 return 数组中的 fifth 项,因为数组索引从零。所以ar1[4-1]将return第四项,加上ar1[4]也就是第五项再除以二求中位数。如果长度为奇数,则return(例如)如果长度为7,则3。然后它检索 arr[3] 这是第四项,它是中位数。

let values = [2, 56, 3, 41, 0, 4, 100, 23];

values.sort(function(a,b) {
 return a - b;
});


let lowMiddle = Math.floor( (values.length - 1) / 2);
let highMiddle = Math.ceil( (values.length - 1) / 2);
let median = ( values[lowMiddle] + values[highMiddle]) / 2;

console.log(median);