Случайная сортировка массива на 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]})
0
1 комментарий
Семен Смирнов
Ответить
Развернуть ветку
-2 комментариев
Раскрывать всегда