【问题标题】:Sort three numbers in array from least to greatest将数组中的三个数字从小到大排序
【发布时间】:2017-07-06 20:40:49
【问题描述】:

我必须创建一个需要 3 个数字的函数。该函数应返回一个数组,其中包含从最小到最大的数字。到目前为止,我有这个。我知道它不正确,但这是一个开始。我也没有使用本机函数。谁能给我一些提示?感谢任何帮助。

   function leastToGreatest (num) {
        var array = [];
        var num1 = 0;
        var num2 = 0;
        var num3 = 0;
        for (var i = 0; i < num.length; i++) {
           if(num[i] < num[i] && num[i] < num[i]) {
                  num[i] = num1;
                  array.push(num1);
           }
           else if(num[i] > num[i] && num[i] < num[i]) {
             num[i] = num2;
             array.push(num2);
           }
           else if(num[i] > num[i] && num[i] > num[i])
             num[i] = num3;
             array.push(num3);
           }
           return array;
     }
     leastToGreatest(2,1,3);

【问题讨论】:

  • 您知道num[i]num[i] 没有任何不同,不是吗? ..这意味着您的所有条件都将导致错误,并且在每个循环中您将num3 推送到数组。
  • @Washington Guedes 是的,我知道。写出一些东西只是伪代码
  • @padawan07。那么,真正的问题是什么?您是否尝试过编写“伪代码”?
  • 如果你想自己编写一个排序函数,你可以很容易地在网上搜索排序方法,有:bubblesort、quicksort、mergesort等。我对你的问题投了反对票,因为你没有表现出任何初步的努力。

标签: javascript arrays sorting for-loop numbers


【解决方案1】:

我建议使用两个for 循环来解决这个问题。例如,

function sortArray(array) {
  var temp = 0;
  for (var i = 0; i < array.length; i++) {
    for (var j = i; j < array.length; j++) {
      if (array[j] < array[i]) {
        temp = array[j];
        array[j] = array[i];
        array[i] = temp;
      }
    }
  }
  return array;
}

console.log(sortArray([3,1,2]));

有了这个功能,无论数组大小,它都会一直排序。

您的功能不起作用的原因(如@WashingtonGuedes 所述)是您每次都在比较相同的值。正如他们所说,您将到达最后一条语句并收到两个false,这将导致您为所有三个if 语句测试false。那么,您返回的数组将为空。

一个建议是不要像你所做的那样对三个值进行硬编码,而是什么都不做,让程序来完成艰苦的工作。在我的代码 sn-p 中,您可以输入任意长度的数组,它会被排序,而不仅仅是长度为 3 的地方。

【讨论】:

  • @WashingtonGuedes OP 显然是在要求手写函数,而不是本机函数,如问题中所述。
  • @WashingtonGuedes 但我同意纠正 OP,将编辑帖子以反映。
  • @WashingtonGuedes 啊,已更正。您对 OP 问题的第一条评论也是错误的,因为没有 if 语句返回 true,因此没有一个语句被执行,而 array 就像它开始时一样为空。
  • 最后一个else if 没有花括号{}
  • @WashingtonGuedes 嗯,非常正确。他的代码中有很多错误,以及 num3 始终为 0,因为它被分配给 num[i] 而不是 num[i] 被分配给 num3
【解决方案2】:

您现在的代码目前不起作用,因为您正在将一个数字与其自身进行比较,所以它总是相等的(导致您的排序什么都不做)。要获得工作排序,您可以解决此问题或使用array.prototype.sort

【讨论】:

  • 是的,我知道这是错误的。我说了算。这只是我写的伪类型代码。我是 JS 新手。在不使用本机函数的情况下如何比较数组中的数字?
【解决方案3】:

这是一个有趣的小变化:

var sortingFunction = function(){ 
  console.log([].slice.apply(arguments).sort(function(a, b) {  return a - b; })); 
}


sortingFunction(3,2,5,1);

您可以传入任意数量的数字,而不仅仅是三个。如果你想限制为三个,你可以在函数中测试它:

var sortingFunction = function(){ 
  var values = [].slice.apply(arguments);
  if(values.length === 3) {
    console.log(values.sort(function(a, b) {  return a - b; })); 
  }
  else
  {
    console.log('you didn\'t pass in three values');
  }
 }


sortingFunction(3,2,5,1);


sortingFunction(3,31,1);

【讨论】:

    【解决方案4】:

    如果你只想要一个数字从小到大排列的数组,你可以使用 sort() 方法和以下参数:

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

    var array = [12,7,18,1];
    array.sort(function(a,b){return (a-b)});
    console.log(array); //Array should be arranged from least to greatest

    【讨论】:

      【解决方案5】:

      如果您只想排序三个项目,您可以通过三个比较和交换轻松完成:

      if (num[0] > num[1])
      {
          // swap num[0] and num[1]
          temp = num[0]; num[0] = num[1]; num[1] = temp;
      }
      if (num[0] > num[2])
      {
          // swap num[0] and num[2]
          temp = num[0]; num[0] = num[2]; num[2] = temp;
      }
      
      // at this point, num[0] contains the smallest of the three numbers
      
      if (num[1] > num[2])
      {
          // swap num[1] and num[2]
          temp = num[1]; num[1] = num[2]; num[1] = temp;
      }
      
      // your three items are sorted
      

      这很容易手动证明是正确的。将数字 1、2 和 3 写在小纸片上,按随机顺序排列,然后执行上述步骤。无论您从什么顺序开始,这都会对这三个项目进行排序。

      了解,以上仅适用于三个项目。如果您想要一种对任意数量的项目进行排序的方法,那么您将需要使用内置的排序方法。

      【讨论】:

        【解决方案6】:
        var sort = function ([x, y, z]) {
          var k = [x, y, z];
          k[0] = Math.min(x, y, z);
        
          if ((x < y && x > z) || (x < z && x > y)) {
            k[1] = x;
          }
          else if ((y < x && y > z) || (y < z && y > x)) {
            k[1] = y;
          }
          else {
            k[1] = z;
          }
        
          k[2] = Math.max(x, y, z);
          return k;
        };
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-07-14
          • 1970-01-01
          • 2021-12-28
          • 1970-01-01
          • 1970-01-01
          • 2017-02-20
          • 2021-11-10
          • 1970-01-01
          相关资源
          最近更新 更多