habrahabr

Случайная сортировка массива на JavaScript

  • среда, 14 августа 2019 г. в 00:20:17
https://habr.com/ru/post/463501/
  • JavaScript


Для случайной сортировки массива можно использовать стандартную конструкцию

array.sort(function() { return Math.random() - 0.5 })

Вроде бы все правильно. Массив должен сортироваться случайным образом. Но это не совсем так. Иногда такой способ вызывает исключение «нарушены условия контракта».

Разбираемся в причинах


Оказывается сортировка вызывается неоднократно и для одних и тех же пар элементов будут разные значения сортировки. Это может привести к повторным перемещениям элементов в списке сортировки. Естественно это сделает сортировку более длительной. Скорее всего внутри сортировщика находится защита от длительной сортировки. Вот мы и получаем такое исключение.

Как стоит производить сортировку?


Метод следующий. Сразу генерим массив случайных чисел рядом и сортируем свой массив как этот сгенерированый. Код реализации такой.

array
.map(function(elem,index) { return [elem, Math.random()]})
.sort(function(a,b){ return a[1] - b[1]})
.map(function(elem){return elem[0]})