首页 > 解决方案 > js中的排序算法有两个条件

问题描述

我有一个问题 - 我正在完成一项任务。任务是在 js 中使用 sort() 将数组分成两部分 - 首先我必须显示数组中所有未除以 3 的数字降序,然后所有数字除以 3 升序。我使用 random() 生成 100 个随机数的数组(如果是示例 - 20)。然后我使用代码来根据他们的可分性设置数字。

例子

12, 75, 80, 47, 66, 60, 2, 65, 65, 68, 97, 32, 5, 14, 15, 11, 65, 53, 76, 97

    table.sort(
      function(a,b){
        if((a % 3) == 0)
        {
          return 1;
        }
        else if(a == 0)
        {
          return 0;
        }
        else
        {
          return -1;
        }
      }
    );

这很好用。

80, 47, 2, 65, 65, 68, 97, 32, 5, 14, 11, 65, 53, 76, 97, 15, 60, 66, 75, 12

现在我有相同的数组,其中第一个数字不除以 3,反之亦然。当我尝试将值设置为升序和降序时,我遇到了一些问题。

    table.sort(
      function(a,b){
        if((a % 3) == 0)
        {
          return a - b;
        }
        else if((a % 3) != 0)
        {
          return b - a;
        }
        else
        {
          return a;
        }
      }
    );

97, 97, 80, 76, 68, 65, 65, 65, 53, 47, 32, 15, 60, 66, 75, 14, 12, 11, 5, 2

首先 - 它不适用于 11 以下的数字,只需将其全部降序打印,而不管它们的可分性如何。
其次 - 它适用于从 12 到 100 左右的数字 - 它做了它应该做的事情,但几乎总是(3 次中有 2 次)在数组的背面有一些未排序的垃圾(或排序不好)。 (检查 exmalpe)
第三 - 如果值设置在 1000 和 10000 之间 - 它工作得很好(我做了很少的测试,也许它失败了,但我没有注意到)

所以这里有一个问题 - 有没有办法以及如何修复我的代码,以便它将相同数组中的数字排序如下:

感谢您的任何提示

@编辑:

片段,如建议的那样:

  var max = 100;

    table = [];

    for(var i = 0 ; i < 20 ; i++)
    {
      var x = Math.floor(Math.random() * max) + 1;
      table[i] = x;
    }
      console.log(table.join(", "));

    table.sort(
      function(a,b){
        if((a % 3) === 0)
        {
          return 1;
        }
        else if(a === 0)
        {
          return 0;
        }
        else
        {
          return -1;
        }
      }
    );
      console.log(table.join(", "));

    table.sort(
      function(a,b){
        if((a % 3) == 0)
        {
          return a - b;
        }
        else if((a % 3) !== 0)
        {
          return b - a;
        }
        else
        {
          return a;
        }
      }
    );
      console.log(table.join(", "));

标签: javascriptarrayssorting

解决方案


let notDividedBy3 = table.filter(x => x % 3 !== 0).sort((a, b) => b - a);
let dividedBy3 = table.filter(x => x % 3 === 0).sort();
let result = [...notDividedBy3, ...dividedBy3];
console.log(result.join(", "));

推荐阅读