Griz
Griz

Reputation: 65

Sorting and Median with Arrays in Javascript

I have been working on this code, and the goal is to sort out the numbers in the array, and then find the median. My median isn't outputting correctly, and when I try to just see what is in array[0], it never has the right value. I'm not exactly sure where I messed up.

Code:

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;

}

Upvotes: 0

Views: 790

Answers (2)

zer00ne
zer00ne

Reputation: 44068

Using purely SO posts, I came up with a solution.

At first, the partial expression (Math.floor(Math.random() * 101)) came up with duplicates, that's weaksauce. Fisher-Yates (aka Knuth) Shuffle has an excellent algorithm.

Your var answer and reduce expression is now combined and out of the loop as per @hyphnKnight explained. There's no need to break it down any further because reduce return is everything you need to display a sorted array. I also used unshift instead of push, I read that it's faster to use the front of the array rather than the back, but you can't tell the difference, too small of a function and all.

Snippet

<!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>

Upvotes: 0

hyphnKnight
hyphnKnight

Reputation: 303

I would suggest first moving your loops ending. Currently you are sorting every single time you add a new number to the array. This means two things : you are wasting computation power on something you should only do once and when you 'log' your result in the line answer = answer + array[i] + " "; its constantly changing since the order is changing. Your functions logic is correct so by making the change below you should get the result you want.

    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;

    }

If you need help with this feel free to message me, also checkout the documentation for reduce HERE.

Upvotes: 1

Related Questions