以最简单,最简洁的方式

时间:2019-07-24 00:37:20

标签: javascript methods

我想在不使用sort()的情况下按升序或降序对数组值进行排序。

我已经创建了一个函数,但是我对此并不满意。 我相信下面的代码可能会更短,更简洁。

请让我知道在哪里进行修改,否则您也可以完全更改代码。先感谢您。


const func = arg => {
    let flip = false;
    let copy = [];

    for(let val of arg) copy[copy.length] = val;    
    for(let i=0; i<arg.length; i++) {
        const previous = arg[i-1];
        const current = arg[i];

        if(previous > current) {
            flip = true;
            copy[i] = previous;
            copy[i-1] = current;
        }
    }

    if(flip) return func(copy);
    return copy;
};

l(func([5,2,8,1,9,4,7,3,6]));

1 个答案:

答案 0 :(得分:0)

如果输入由整数组成(例如在示例中),则pne选项是将数组简化为一个对象,该对象的键是数字,其值是到目前为止这些值出现的次数。然后,在对象上进行迭代(对于整数键,其Object.entries将按照升序数字键顺序进行迭代),并创建要返回的数组:

const func = arr => {
  const valuesObj = {};
  arr.forEach((num) => {
    valuesObj[num] = (valuesObj[num] || 0) + 1;
  });
  return Object.entries(valuesObj)
    .flatMap(
      ([num, count]) => Array(count).fill(num)
    );
};


console.log(
  func([5,2,8,1,9,10,10,11,4,7,3,6])
);

此过程运行时间为O(N)

要在保持O(N)运行时的同时还要考虑负整数,请为负创建另一个对象:

const func = arr => {
  const valuesObj = {};
  const negativeValuesObj = {};
  arr.forEach((num) => {
    if (num >= 0) valuesObj[num] = (valuesObj[num] || 0) + 1;
    else negativeValuesObj[-num] = (negativeValuesObj[-num] || 0) + 1;
  });
  return [
    ...Object.entries(negativeValuesObj).reverse()
      .flatMap(
        ([num, count]) => Array(count).fill(-num)
      ),
    ...Object.entries(valuesObj)
      .flatMap(
        ([num, count]) => Array(count).fill(num)
      )
  ];
};


console.log(
  func([5,2,8,1,-5, -1, 9,10,10,11,4,7,3,6, -10])
);

对于非整数项目,您必须使用具有更高计算复杂度的其他算法。