4
votes

Trier le tableau de nombres par distribution normale (distribution gaussienne)

Ayant un tableau de nombres setOfNumbers = [0, 3, 3, 2, 7, 1, -2, 9] Je voudrais trier cet ensemble pour avoir les plus petits nombres sur le fin et début et le plus grand au centre de l'ensemble trié comme ceci 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);

Je suis sûr qu'il est possible de trier ces nombres avec la méthode Array.prototype.sort () , mais à quoi devrait ressembler cette fonction de tri?

MODIFIER: La solution n'a pas à être résolue avec .sort () . Ce n'était qu'une idée.


4 commentaires

Je suis peut-être naïf quant au fonctionnement de cette distribution, mais comment déterminez-vous quels nombres sont mis au début et lesquels à la fin? Ou cela n'a-t-il pas d'importance?


Cela n'a pas vraiment d'importance. Il n'est pas nécessaire que le résultat soit exactement celui de la réponse. Je l'ai fait manuellement. Les étapes où 1) Choisissez le plus grand nombre 2) Trouvez le plus grand nombre suivant de l'ensemble de gauche 3) Ajoutez des modifications à gauche et à droite au jeu de résultats.


@OliverRadini nombre max entre moins de max à droite et plus grand que max à gauche


@all Si la question n'est pas assez claire et que vous pensez avoir compris mon problème, n'hésitez pas à modifier la question.


3 Réponses :


6
votes

C'est peut-être la façon la plus naïve de le faire, mais n'est-ce pas simplement gauche, droite, gauche, droite ... après le tri?

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());

Ou simplement:

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());


1 commentaires

Impressionnant, vous deux @Yoshi et @NinaScholz!



0
votes

Cette solution n'est pas vraiment élégante, mais elle fait son travail.

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 commentaires

2
votes

Une approche légèrement différente consiste à trier le tableau par ordre croissant.

Obtenir un autre tableau d'indices et trier les cotes dans la première moitié par ordre décroissant et les valeurs paires jusqu'à la fin par ordre décroissant avec un mélange papillon inversé em>.

Ensuite, mappez le tableau trié en prenant la valeur des indices triés.

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);

[-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


0 commentaires