Інверсія, сортування і перемішування масивів

інверсія масиву

Для зміни порядку елементів в масиві на протилежний використовується метод reverse. Цей метод змінює порядок елементів у вихідному масиві і повертає посилання на самого себе.

При цьому пропуски в масиві зберігаються.

Сортування елементів

Метод sort сортує елементи масиву, змінюючи порядок елементів у вихідному масиві. sort приймає єдиним аргументом функцію, що порівнює елементи масиву. Якщо функція порівняння не задана, то елементи упорядковано в лексикографічному порядку.

Навіть якщо впорядкувати масив, що складається тільки з чисел, вони все одно будуть відсортовані як рядки, а не як числа.

Щоб впорядкувати масив чисел, необхідно передати методу sort функцію порівняння двох чисел. Функція, що передається методу sort. по черзі викликається для різних пар елементів масиву, і повинна повернути від'ємне число, якщо перший аргумент менше другого, позитивне число, якщо перший аргумент більше другого, і 0. Якщо вони рівні. Таким чином код, сортують масив чисел буде виглядати наступним чином.

За допомогою callback-функції масиви можна сортувати по будь-яким критерієм. Наприклад, впорядкувати масив об'єктів за значенням якої-небудь властивості, або навіть декількох властивостей.

Callback-функція обов'язково повинна повертати число, в іншому випадку Internet Explorer викине помилку, а інші браузери просто не відсортують масив.

Пропуски в масиві, так само як і елементи масиву, рівні undefined при сортуванні не враховуються зовсім. Дані елементи просто виявляються в кінці масиву.

Щоб впорядкувати масив в зворотному лексикографічному порядку, досить після виклику sort без аргументів викликати метод reverse. Для інших типів сортування доведеться видозмінювати callback-функцію.

перемішування елементів

Однак даний спосіб не можна назвати ефективним, він переменшівает по різному в різних браузерах, але завжди дуже нерівномірно. Створимо тест: будемо багаторазово перемішувати масив з десяти послідовних чисел від 0 до 9. і підрахуємо, скільки разів кожне з чисел виявиться на першому місці.

У Firefox результат тесту буде сильно схожий на 1860,1841,1223,704,633,613,409,255,1226,1236. тобто найчастіше під нульовим індексом перемішаного масиву буде нульовий же індекс вихідного масиву, а найрідше - сьомий.

В IE і Safari результати зовсім інші, але не краще: 471,890,855,1362,1090,1088,844,1252,1084,1064. тут нульовий індекс вихідного масиву буде набагато рідше надаватися під нульовим індексом в відсортованому масиві.

В Opera розкид набагато більше, але упорядоченнее: 2810,2861,1391,233,206,914,946,459,86,94. У Chrome схожа ситуація, але ще гірше: 2868,2930,1962,1076,574,291,164,82,33,20.

Висновок - використовувати таке перемішування дуже неефективно. Набагато краще перебрати всі елементи і поміняти їх на довільний з більшим чи рівним індексом. Тільки перебирати елементи будемо з кінця масиву, щоб взяття випадкового числа було простіше.

Попередній тест для такого способу буде давати для кожного індексу 1000 плюс-мінус 40 повторень, що є, безсумнівно, найбільш оптимальним результатом. Більш того, даний спосіб швидше попереднього в різних браузерах на 40-70%.

Схожі статті