我试图找到一个数组的中位数。 我做了很多研究,如果这似乎被多次询问,没有答案令人满意。
创建我的数组工作得很好但是当我调用该函数时,数组已经排序,但它返回不同的值,从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:停止填充数组,只输入没有值。)
答案 0 :(得分:3)
您的代码中有2个问题:
half
,使其始终为0. 工作:
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);
答案 1 :(得分:0)
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);
答案 2 :(得分:-1)
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)
将返回(例如)4
,其长度为8
。但是,如果你执行ar1[4]
,它将实际返回数组中 第五个 项,因为数组索引从零开始。因此ar1[4-1]
将返回第四项,将其添加到ar1[4]
这是第五项并将其除以2以找到中位数。如果长度为奇数,则如果长度为3
,则返回(例如)7
。然后它检索arr[3]
,这是第四个项目,即中位数。