【问题标题】:bubble sort for simple leaderboard简单排行榜的冒泡排序
【发布时间】:2015-06-22 05:13:48
【问题描述】:

我正在创建一个简单的视频游戏排行榜,它将根据预先设定的分数对用户得分进行排名,这将根据他们的排名从最高到最低。

<html>
  <!Foundation Page for building our Javascript programs>
  <head>
    <title>The Foundation Page </title>
    <script type="text/javascript">
      function leaderboard()
      {
        var leaderboardarray = new Array (5);
        var n, temp;
        ok=false;
        var score 
        var rank

        score = 150

        leaderboardarray[1] = 50;
        leaderboardarray[2] = 60;
        leaderboardarray[3] = 180;
        leaderboardarray[4] = 120;
        leaderboardarray[5] = score;

        while(!ok)
        {
          ok = true
          for (n=1; n<=5; n=n+1)
          { 
            if (leaderboardarray [n]<leaderboardarray [n-1])
            {
              leaderboardarray [n] = leaderboardarray [n-1];
              ok = false;
            }
          } 
        }

        for (n=5; n>=1; n=n-1) 
          document.write (leaderboardarray [n] + "<br>");
      }

    </script>
  </head>head>
  <body BGCOLOR="WHITE">
    <h2>The Foundation Page </h2>
    <hr>
    <script LANGUAGE="Javascript"> leaderboard() </script>

  </body>
</html>

它正常输出数组,但我被困在数组如何输出从最高到最低的值。当我在它后面放置一个高于任何其他值的值时,它只会产生相同的值。当我将其中一个值更改为是否有人建议我应该怎么做时,将不胜感激。如果我做任何愚蠢的事情,我还是编程新手,很抱歉。谢谢!

【问题讨论】:

  • 使用Array.prototype.sort()
  • Array.prototype.sort 在 MDN 上
  • 专业提示:不要在代码中使用document.writebgcolor。这不是您在 HTML 中编写评论的方式。 (第二行)
  • 我稍微清理了你的代码。我认为这不会影响任何事情,但您的所有标签都是大写的。我不确定这在技术上是否不正确,但绝对是非常规的。除此之外,您还忘记关闭 head 标签。我解决了这几个问题。如果你是编程新手,最重要的是你要养成良好的习惯,所以可能要仔细检查标签 HTML 语法约定。

标签: javascript arrays sorting leaderboard


【解决方案1】:

由于您使用的是没有原型或 jQuery 的 Javascript,您是否尝试过将 while 语句替换为以下内容:

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

有一个great write-up of the Javascript sort function at w3schools.

<HTML>
<!--#Foundation Page for building our Javascript programs#-->
<HEAD>
<TITLE>The Foundation Page </TITLE>
<!--fixed this-->
<SCRIPT type="text/javascript">
    function leaderboard()
    {

            var n, temp;
            ok=false;
            var score 
            var rank

            var score = 150

            var leaderboardarray = new Array(5);
                leaderboardarray[0] = 50;
                leaderboardarray[1] = 60;
                leaderboardarray[2] = 180;
                leaderboardarray[3] = 120;
                leaderboardarray[4] = score;

            leaderboardarray.sort(function(a, b){return b-a});
            var myContent = '';
            for (var n=0;n<5;n++) 
                myContent += leaderboardarray[n] + "<br>";

            document.getElementById("leaderBoard").innerHTML = myContent;
    }

    //call the function here


</SCRIPT>
</HEAD>
<!--#Using CSS#-->
<BODY style="background-color:#FFF;">
        <H2>The Foundation Page </H2>
        <HR>
        <!--#This is a placeholder#-->
        <div id="leaderBoard"><script type="text/javascript">leaderboard();</script></div>

</BODY>
</HTML>

关于您的代码需要解决的问题很少。

  • 您有两个头部标签。
  • 您正在对数组进行排序,然后显示 带有递减 for 语句的输出。在这个我排序 数组按降序排列,然后显示升序输出。
  • 我还将数组从 0(它们想要的位置)开始,这样可以减少 for 语句中的数学运算。
  • 我已经用 CSS 替换了 bgcolor HTML 标签
  • 更新了脚本标签以使用type 而不是language
  • 我将替换占位符 div 的内容,而不是使用 document.write which can cause problems

Here is a fiddle.

【讨论】:

    【解决方案2】:

    您应该使用 Array.sort。

    但是,您发布的代码的问题是,您实际上并没有在冒泡排序中进行交换。您只是用较大的值覆盖较小的值。

    function bubbleSort(arr) {
      var n = arr.length, swapped, tmp;
      do {
        swapped = false;
        for (var i = 1; i < n; i++) {
          if (arr[i-1] < arr[i]) {
            tmp = arr[i];
            arr[i] = arr[i-1];
            arr[i-1] = tmp;
            swapped = true; 
          }
        }
      } while (swapped && n--)
    }
    
    a = [50, 60, 70, 80, 150, 120]
    
    bubbleSort(a);
    console.log(a);
    // [150, 120, 80, 70, 60, 50]

    【讨论】:

    • 谢谢!一段时间以来,我一直在试图弄清楚它到底出了什么问题。
    猜你喜欢
    • 2013-01-23
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 2015-08-20
    • 1970-01-01
    • 2015-09-12
    • 2016-09-06
    • 2014-06-25
    相关资源
    最近更新 更多