Evernote Pre-screening challenge

Summary

Write a function that finds the highest 4 integers in an unordered list of numbers and describe its performance in O(n) time. Use any language you desire. Create a solution that is well written and with good performance.
Input
Output
Pot of gold
Code
  <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:2;-o-tab-size:2;tab-size:2;"><code class="language-js" data-lang="js"><span style="display:flex;"><span>(<span style="color:#66d9ef">function</span>() {
  </span></span><span style="display:flex;"><span>  <span style="color:#75715e">/**
  </span></span></span><span style="display:flex;"><span><span style="color:#75715e">   * @return {void}
  </span></span></span><span style="display:flex;"><span><span style="color:#75715e">   * @param {array} array of numbers
  </span></span></span><span style="display:flex;"><span><span style="color:#75715e">   * @param {int} how many numbers to return
  </span></span></span><span style="display:flex;"><span><span style="color:#75715e">   * @param {function} optional callback
  </span></span></span><span style="display:flex;"><span><span style="color:#75715e">   */</span>
  </span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">getHighs</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">function</span>(<span style="color:#a6e22e">data</span>, <span style="color:#a6e22e">returnsize</span>, <span style="color:#a6e22e">callback</span>) {
  </span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">returnsize</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">returnsize</span> <span style="color:#f92672">&amp;&amp;</span> <span style="color:#f92672">!</span>isNaN(<span style="color:#a6e22e">returnsize</span>) <span style="color:#f92672">?</span> <span style="color:#a6e22e">returnsize</span> <span style="color:#f92672">:</span> <span style="color:#ae81ff">4</span>;
  </span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">min</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">null</span>, <span style="color:#a6e22e">highs</span> <span style="color:#f92672">=</span> [];
  </span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">var</span> <span style="color:#a6e22e">i</span><span style="color:#f92672">=</span><span style="color:#ae81ff">0</span>, <span style="color:#a6e22e">len</span><span style="color:#f92672">=</span><span style="color:#a6e22e">data</span>.<span style="color:#a6e22e">length</span>; <span style="color:#a6e22e">i</span> <span style="color:#f92672">&lt;</span> <span style="color:#a6e22e">len</span>; <span style="color:#a6e22e">i</span><span style="color:#f92672">++</span>) {
  </span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">if</span> (isNaN(<span style="color:#a6e22e">data</span>[<span style="color:#a6e22e">i</span>])) {
  </span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">continue</span>;
  </span></span><span style="display:flex;"><span>      }
  </span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">highs</span>.<span style="color:#a6e22e">length</span> <span style="color:#f92672">&lt;</span> <span style="color:#a6e22e">returnsize</span>) {
  </span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">highs</span>.<span style="color:#a6e22e">push</span>(<span style="color:#a6e22e">data</span>[<span style="color:#a6e22e">i</span>]);
  </span></span><span style="display:flex;"><span>      } <span style="color:#66d9ef">else</span> {
  </span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">data</span>[<span style="color:#a6e22e">i</span>] <span style="color:#f92672">&lt;</span> <span style="color:#a6e22e">min</span>) {
  </span></span><span style="display:flex;"><span>          <span style="color:#66d9ef">continue</span>;
  </span></span><span style="display:flex;"><span>        }
  </span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">highs</span>[<span style="color:#a6e22e">highs</span>.<span style="color:#a6e22e">length</span> <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>] <span style="color:#f92672">=</span> <span style="color:#a6e22e">data</span>[<span style="color:#a6e22e">i</span>];
  </span></span><span style="display:flex;"><span>      }
  </span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">highs</span>.<span style="color:#a6e22e">sort</span>(<span style="color:#66d9ef">function</span>(<span style="color:#a6e22e">a</span>, <span style="color:#a6e22e">b</span>) {
  </span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> <span style="color:#a6e22e">b</span> <span style="color:#f92672">-</span> <span style="color:#a6e22e">a</span>;
  </span></span><span style="display:flex;"><span>      });
  </span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">min</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">highs</span>[<span style="color:#a6e22e">highs</span>.<span style="color:#a6e22e">length</span> <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>];
  </span></span><span style="display:flex;"><span>    }
  </span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">callback</span> <span style="color:#f92672">&amp;&amp;</span> <span style="color:#e6db74">&#34;function&#34;</span> <span style="color:#f92672">===</span> <span style="color:#66d9ef">typeof</span> <span style="color:#a6e22e">callback</span>) {
  </span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">callback</span>(<span style="color:#a6e22e">highs</span>);
  </span></span><span style="display:flex;"><span>    }
  </span></span><span style="display:flex;"><span>  };
  </span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">run</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">function</span>() {
  </span></span><span style="display:flex;"><span>    <span style="color:#75715e">// test config
  </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>    <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">returnsize</span> <span style="color:#f92672">=</span> parseInt(document.<span style="color:#a6e22e">getElementById</span>(<span style="color:#e6db74">&#39;input-returnsize&#39;</span>).<span style="color:#a6e22e">value</span>, <span style="color:#ae81ff">10</span>),
  </span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">samplesize</span> <span style="color:#f92672">=</span> parseInt(document.<span style="color:#a6e22e">getElementById</span>(<span style="color:#e6db74">&#39;input-samplesize&#39;</span>).<span style="color:#a6e22e">value</span>, <span style="color:#ae81ff">10</span>),
  </span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">lowerbound</span> <span style="color:#f92672">=</span> parseInt(document.<span style="color:#a6e22e">getElementById</span>(<span style="color:#e6db74">&#39;input-lowerbound&#39;</span>).<span style="color:#a6e22e">value</span>, <span style="color:#ae81ff">10</span>),
  </span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">upperbound</span> <span style="color:#f92672">=</span> parseInt(document.<span style="color:#a6e22e">getElementById</span>(<span style="color:#e6db74">&#39;input-upperbound&#39;</span>).<span style="color:#a6e22e">value</span>, <span style="color:#ae81ff">10</span>);
  </span></span><span style="display:flex;"><span>    <span style="color:#75715e">// generate test data
  </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>    <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">dataset</span>    <span style="color:#f92672">=</span> [];
  </span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">while</span> (<span style="color:#a6e22e">samplesize</span><span style="color:#f92672">--</span>) {
  </span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">dataset</span>.<span style="color:#a6e22e">push</span>(Math.<span style="color:#a6e22e">floor</span>(Math.<span style="color:#a6e22e">random</span>() <span style="color:#f92672">*</span> (<span style="color:#a6e22e">upperbound</span> <span style="color:#f92672">-</span> <span style="color:#a6e22e">lowerbound</span>) <span style="color:#f92672">+</span> <span style="color:#a6e22e">lowerbound</span>));
  </span></span><span style="display:flex;"><span>    }
  </span></span><span style="display:flex;"><span>    document.<span style="color:#a6e22e">getElementById</span>(<span style="color:#e6db74">&#39;sampleset&#39;</span>).<span style="color:#a6e22e">innerHTML</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">dataset</span>.<span style="color:#a6e22e">join</span>(<span style="color:#e6db74">&#39;, &#39;</span>);
  </span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">getHighs</span>(<span style="color:#a6e22e">dataset</span>, <span style="color:#a6e22e">returnsize</span>,
  </span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">function</span>(<span style="color:#a6e22e">rs</span>) {
  </span></span><span style="display:flex;"><span>        document.<span style="color:#a6e22e">getElementById</span>(<span style="color:#e6db74">&#39;resultset&#39;</span>).<span style="color:#a6e22e">innerHTML</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">rs</span>.<span style="color:#a6e22e">join</span>(<span style="color:#e6db74">&#39;, &#39;</span>);
  </span></span><span style="display:flex;"><span>      }
  </span></span><span style="display:flex;"><span>    );
  </span></span><span style="display:flex;"><span>  };
  </span></span><span style="display:flex;"><span>  document.<span style="color:#a6e22e">getElementById</span>(<span style="color:#e6db74">&#39;form-sample-generator&#39;</span>).<span style="color:#a6e22e">addEventListener</span>(<span style="color:#e6db74">&#39;submit&#39;</span>, <span style="color:#66d9ef">function</span>(<span style="color:#a6e22e">event</span>) {
  </span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">event</span>.<span style="color:#a6e22e">preventDefault</span>();
  </span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">run</span>();
  </span></span><span style="display:flex;"><span>  });
  </span></span><span style="display:flex;"><span>})();</span></span></code></pre></div>
</div>