Сортировать массив чисел по нормальному распределению (распределение Гаусса) - PullRequest
0 голосов
/ 29 января 2019

Имея массив чисел 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().Это была только идея.

Ответы [ 3 ]

0 голосов
/ 29 января 2019

Это решение не очень элегантно, но оно выполняет свою работу.

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);
0 голосов
/ 29 января 2019

Немного другой подход заключается в сортировке массива по возрастанию.

Получить другой массив индексов и отсортировать шансы по первой половине по возрастанию, а четные значения до конца по убыванию с перевернутой бабочкойshuffle .

Затем сопоставьте отсортированный массив, взяв значение отсортированных индексов.

[-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);
0 голосов
/ 29 января 2019

Это может быть самый наивный способ сделать это, но разве это не просто налево, направо, налево, направо ... после сортировки?

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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...