在 Javascript 中使用数组进行排序和中位数

Sorting and Median with Arrays in Javascript

本文关键字:排序 中位数 数组 Javascript      更新时间:2023-09-26

我一直在研究这段代码,目标是整理数组中的数字,然后找到中位数。我的中位数没有正确输出,当我尝试只查看数组 [0] 中的内容时,它永远不会有正确的值。我不确定我在哪里搞砸了。

法典:

var array = [];
window.onload = function (){
   var answer = '';
   var median = 0;
   for (var i = 0; i < 8; i++) {
   var rand = Math.floor(Math.random() * 101);
   array.push(rand);
   array.sort(function(a, b){return a-b});

   answer = answer + array[i] + " ";
   }
median = ((array[3] + array[4]) /2);
document.getElementById("result").innerHTML = answer + "<br />" + median;
}

我建议首先移动你的循环结尾。目前,每次向数组添加新数字时,您都会进行排序。这意味着两件事:你浪费了计算能力在你应该只做一次的事情上,当你在行中"记录"你的结果时,answer = answer + array[i] + " ";它不断变化,因为顺序在变化。您的函数逻辑是正确的,因此通过进行下面的更改,您应该得到所需的结果。

    var array = [];
    window.onload = function (){
        var answer = '';
        var median = 0;
        //Loop is simplified to just push a random value
        for (var i = 0; i < 8; i++) {
            array.push(Math.floor(Math.random() * 101));
        }
        //Sort is outside of the loop;
        array.sort(function(a, b){return a-b});
        //Median is outside of the loop
        median = ((array[3] + array[4]) /2);
        //answer is outside of the loop (if you don't know reduce look at the link below)
        answer = array.reduce( function ( answer , value ) {
           return answer + ',' + value;
        } );
        // put into the dom
        document.getElementById("result").innerHTML = answer + "<br />" + median;
    }

如果您需要这方面的帮助,请随时给我发消息,也可以查看减少的文档 这里.

使用纯粹的SO帖子,我想出了一个解决方案。

  • 策略
  • 洗牌

起初,部分表达式(Math.floor(Math.random() * 101))想出了重复项,这就是弱酱。Fisher-Yates(又名Knuth)Shuffle有一个优秀的算法。

您的var answerreduce表达式现在已按照@hyphnKnight解释进行组合并脱离循环。没有必要进一步分解它,因为减少回报是显示排序数组所需的一切。我也用unshift代替push,我读到使用数组的前面比后面更快,但你无法分辨出区别,功能太小了。

片段

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>35469092</title>
</head>
<output id="result"></output>
<body>
<script>
// 1. Populate an array with the numbers 1 through 100.
var arr = [];
for(var i = 1; i <= 100; i++) {
	arr.unshift(i);
}
median(arr);
function median(arr){
   var median = 0;
	 // 2. Shuffle
   var ran100 = shuffle(arr); 
	 var ran8 = [];
	 for(var j = 0; j < 8; j++) {
		 // Take the first 8 elements of the resulting array.
		 ran8.unshift(ran100[j]);  
	 }
	var answer = ran8.sort(function(a, b){return a-b});
	median = ((ran8[3] + ran8[4]) /2);
	document.getElementById("result").innerHTML = answer + "<br />" + median;
}
function shuffle(arr) {
  var curIdx = arr.length, tmpVal, randIdx;
  while (0 !== curIdx) {
    ranIdx = Math.floor(Math.random() * curIdx);
    curIdx -= 1;
    tmpVal = arr[curIdx];
    arr[curIdx] = arr[ranIdx];
    arr[ranIdx] = tmpVal;
  }
  return arr;
}
</script>
</body>
</html>