Почему сортировка показывает различное поведение при сортировке длинного массива и короткого массива? - PullRequest
0 голосов
/ 02 февраля 2019

у меня есть и два arrays из objects, которые имеют два свойства same(0)for all и value(0,1,2,...).Я создал оба массива, используя для цикла.Я отсортировал массив на основе same.long изменяется, но short не
Я только хочу знать, почему все это происходит

Почему даже изменяется массив long

let short = [];
for(let i = 0;i < 5;i++){
  short.push({same:0,value:i});
}
let long = []
for(let i = 0;i < 16;i++){
  long.push({same:0,value:i});
}
//It returns same array with same order
console.log(short.sort((obj1,obj2) => obj1.same - obj2.same));
//It returns array with different order
console.log(long.sort((obj1,obj2) => obj1.same - obj2.same));

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

См. https://v8.dev/blog/array-sort

Это поведение зависит от реализации.Ваш алгоритм сортировки сохраняет порядок, если реализация сортировки является стабильной и в противном случае имеет непредсказуемое поведение.Некоторые движки используют разные алгоритмы в зависимости от длины массива.Иногда нестабильность можно увидеть только в массивах некоторой длины.

Например, Node.js 10 с V8 6.8 будет выводить:

[ { same: 0, value: 0 },
  { same: 0, value: 1 },
  { same: 0, value: 2 },
  { same: 0, value: 3 },
  { same: 0, value: 4 } ]
[ { same: 0, value: 8 },
  { same: 0, value: 0 },
  { same: 0, value: 2 },
  { same: 0, value: 3 },
  { same: 0, value: 4 },
  { same: 0, value: 5 },
  { same: 0, value: 6 },
  { same: 0, value: 7 },
  { same: 0, value: 1 },
  { same: 0, value: 9 },
  { same: 0, value: 10 },
  { same: 0, value: 11 },
  { same: 0, value: 12 },
  { same: 0, value: 13 },
  { same: 0, value: 14 },
  { same: 0, value: 15 } ]

В то время как Node.js 11 с V8 7.0 со стабильнымотсортировать вывод:

[ { same: 0, value: 0 },
  { same: 0, value: 1 },
  { same: 0, value: 2 },
  { same: 0, value: 3 },
  { same: 0, value: 4 } ]
[ { same: 0, value: 0 },
  { same: 0, value: 1 },
  { same: 0, value: 2 },
  { same: 0, value: 3 },
  { same: 0, value: 4 },
  { same: 0, value: 5 },
  { same: 0, value: 6 },
  { same: 0, value: 7 },
  { same: 0, value: 8 },
  { same: 0, value: 9 },
  { same: 0, value: 10 },
  { same: 0, value: 11 },
  { same: 0, value: 12 },
  { same: 0, value: 13 },
  { same: 0, value: 14 },
  { same: 0, value: 15 } ]
0 голосов
/ 02 февраля 2019

Функция сравнения Array.sort принимает 2 параметры;1-й параметр - это элемент, а 2-й - другой элемент.

В вашем операционном операторе вы передаете только 1 параметр;

Вот как это должно выглядеть:

let short = []
let long = []

for(let i = 0; i < 5; i++) {
  short.push({same:0, value: i})
}

for(let i = 0; i < 16; i++){
  long.push({same:0, value: i})
}

console.log('short')
console.log(short.sort((a, b) => a.value - b.value))

console.log('long')
console.log(long.sort((a, b) => a.value - b.value))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...