【问题标题】:Sort array of numbers by normal distribution (gaussian distribution)按正态分布(高斯分布)对数字数组进行排序
【发布时间】:2019-06-22 13:05:44
【问题描述】:

有一个数字数组setOfNumbers = [0, 3, 3, 2, 7, 1, -2, 9],我想对这个集合进行排序,让最小的数字在末尾和开头,最大的数字在排序集的中心,就像这样sortedSetNumbers = [0, 2, 3, 9, 7, 3, 1, -2]

const setOfNumbers = [0, 3, 3, 2, 7, 1, -2, 9];
const result = [0, 2, 3, 9, 7, 3, 1, -2];

function sortNormal(a, b) {
  return true; // Please, change this line
}

const sortedSetNumbers = setOfNumbers.sort((a, b) => sortNormal(a, b));



if (sortedSetNumbers === result) {
  console.info('Succeeded Normal Distributed');
} else {
  console.warn('Failed Normal Distribution');
}

console.log(sortedSetNumbers);

我确定可以用Array.prototype.sort()方法对这些数字进行排序,但是这个排序函数应该是什么样子的呢?

编辑:该解决方案不必用.sort() 解决。那只是一个想法。

【问题讨论】:

  • 也许我对这种分布的工作原理很幼稚,但是您如何确定哪些数字放在开头,哪些放在结尾?还是没关系?
  • 这并不重要。结果不必完全是答案中的那个。我已经手动完成了。步骤 1) 选择最大数 2) 找到左集的下一个最大数 3) 将左右改变附加到结果集。
  • @OliverRadini 右侧小于最大值和左侧大于最大值之间的最大值
  • @all 如果问题不够清楚,并且您认为您已经理解我的问题,请随时编辑问题。

标签: javascript sorting gaussian normal-distribution


【解决方案1】:

这可能是最幼稚的做法,但不就是简单的左、右、左、右……排序后吗?

const input    = [0, 3, 3, 2, 7, 1, -2, 9];
const expected = [0, 2, 3, 9, 7, 3, 1, -2];

const sorted   = input.slice().sort();
const output   = [];
let side       = true;

while (sorted.length) {
  output[side ? 'unshift' : 'push'](sorted.pop());
  side = !side;
}

console.log(expected.join());
console.log(output.join());

或者简单地说:

const input  = [0, 3, 3, 2, 7, 1, -2, 9];
const output = input.slice().sort().reduceRight((acc, val, i) => {
  return i % 2 === 0 ? [...acc, val] : [val, ...acc];
}, []);

console.log(output.join());

【讨论】:

  • 令人印象深刻,你们俩@Yoshi 和@NinaScholz!
【解决方案2】:

一种稍微不同的方法是对数组进行升序排序。

获取另一个索引数组,并将赔率排序为前半部分升序,偶数值排序为最后一个倒置的蝴蝶洗牌

然后通过获取排序索引的值来映射排序数组。

[-2, 0, 1, 2, 3, 3, 7,  9] // sorted array
[ 1, 3, 5, 7, 6, 4, 2,  0] // sorted indices
[ 0, 2, 3, 9, 7, 3, 1, -2] // rebuild sorted array

var array = [0, 3, 3, 2, 7, 1, -2, 9].sort((a, b) => a - b);

array = Array
    .from(array, (_, i) => i)
    .sort((a, b) => b % 2 - a % 2 || (a % 2 ? a - b : b - a))
    .map(i => array[i]);

console.log(array);

【讨论】:

    【解决方案3】:

    这个解决方案不是很优雅,但确实可以。

    const setOfNumbers = [0, 3, 3, 2, 7, 1, -2, 9];
    const alternation = alternate();
    const sortedSetNumbers = sortNormal(setOfNumbers);
    
    function sortNormal(start) {
      const result = [];
      const interim = start.sort((a, b) => {
        return b - a;
      });
    
      interim.map(n => {
        if (alternation.next().value) {
          result.splice(0, 0, n);
        } else {
          result.splice(result.length, 0, n);
        }
      });
    
      return result;
    }
    
    function* alternate() {
      let i = true;
    
      while (true) {
        yield i;
        i = !i;
      }
    }
    
    console.log(sortedSetNumbers);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-16
      • 2011-09-10
      • 2023-03-26
      • 1970-01-01
      • 2020-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多