Windows 7, XP

Javascript сортировка чисел массива по возрастанию. JavaScript - Сортировка массива с помощью функции

Javascript сортировка чисел массива по возрастанию. JavaScript - Сортировка массива с помощью функции

В JavaScript можно сортировать массивы с помощью метода sort. В качестве единственного необязательного аргумента метод принимает функцию, определяющую правила сортировки. Если sort вызвали без аргументов, то сортировка осуществляется по возрастанию значений элементов. Пример:

// Массив со значениями различных типов var arr = ; // Сортируем arr.sort(); // Вернет

Сортируется массив, в контексте которого вызван метод, так что если вы желаете сохранить исходное состояние - сделайте копию и сортируйте её.
Функции сортировки

Вы можете настраивать сортировку, передавая методу sort специальную функцию. В качестве аргументов функция принимает два значения массива, которые передаст метод sort. Вернуть функция может следующие значения (спасибо за уточнение пользователю alik):

* положительное (1,2,10), если условие сортировки истинно;
* отрицательное (-0.1, -3, -20), если условие сортировки ложно;
* 0, если сравниваемые значения равны.

var arr = ; // Функции сортировки function sIncrease(i, ii) { // По возрастанию if (i > ii) return 1; else if (i < ii) return -1; else return 0; } function sDecrease(i, ii) { // По убыванию if (i > ii) return -1; else if (i < ii) return 1; else return 0; } function sRand() { // Случайная return Math.random() > 0.5 ? 1: -1; } arr.sort(sIncrease); // Вернет arr.sort(sDecrease); // Вернет arr.sort(sRand); // Вернет случайно отсортированный массив, например

Производительность

На первый взгляд может показаться, что сортировка в JavaScript непроизводительна, и в web-приложениях лучше сортировать данные на server-side. Небольшой эксперимент это опровергает. Будьте осторожны, в циклах на 100.000 элементов браузер может зависнуть!

Сортируем массивы c целочисленными значениями различной длины:
Нет данных

можете зависнуть

Автор, в ходе своих экспериментов на своем PC (Vista, Pentium Dual 2.2Ггц, 2Гб RAM) получил следующие результаты:
1000 10.000 100.000
IE 7 20-50 ms 200-650 ms завис
FF 3 1-2 ms 12-30 ms 150-400 ms
Safari 3 2-30 ms * 30-400 ms * 350-5000 ms *
Opera 9.5 2-5 ms 40-75 ms 500-1000 ms
Chrome 1.0 1-2 ms 10-30 ms 100-300ms

* В Safari случайная сортировка занимала ровно на порядок больше времени, чем сортировка по возрастанию/убыванию.

За исключением Internet Explorer, который не смог переварить массив на 100.000 элементов, сортировка показала себя вполне производительной операцией.
Многомерный массив

При необходимости можно усложнить функции сортировки. Например, чтобы сортировать многомерные массивы (массивы массивов), или массивы объектов, или любой другой массив с нетривиальными значениями. Пример:

var multi = [ ["Nikolay", 34], ["Andrey", 23], ["Stanislav", 20] ]; // Функции сортировки function sName(i, ii) { // По имени (возрастание) if (i > ii) return 1; else if (i < ii) return -1; else return 0; } function sAge(i, ii) { // По возрасту (возрастание) if (i > ii) return 1; else if (i < ii) return -1; else return 0; } multi.sort(sName); // Вернет [,,] multi.sort(sAge); // Вернет [,,]

Хорошо Плохо

    Благодаря своей мощности и гибкости в работе массивы стали непременным атрибутом PHP. Причем, в ряде сложных ситуаций можно задействовать и двумерные массивы PHP.…

    Сортировка данных - обязательная функция для сайта, если на нем есть контент, отображаемый в виде таблицы. Для удобства пользователя необходимо сделать таблицу…

По умолчанию метод sort сортирует массив в алфавитном порядке, для этого он представляет каждое значение элемента массива как строку с помощью метода toString() .

Например, сортировка массива, состоящего из чисел:

Var arrNumbers = new Array (50,4,1,76,20,3,27,5,501); document.write("Исходный массив:"); document.write("

"); arrNumbers.sort(); document.write("Отсортированный массив:"); document.write("

Чтобы отсортировать массив так, как мы хотим, нам необходимо написать специальную функцию и передать её имя в качестве параметра методу sort .

Но перед тем как перейти к созданию функции, давайте рассмотрим алгоритм, с помощью которого метод sort упорядочивает массив. На самом деле алгоритм сортировки очень прост и заключается в многократном сравнении 2 рядом расположенных элементов в массиве, которые в зависимости от результата сравнения переставляются (упорядочиваются).

Следовательно, специальная функция должно иметь 2 параметра. Причём передавать значения этих параметров будет сам метод sort , т.е. значения параметров нам не известны. А для нас это и не важно, т.к. наша задача сводится к написанию алгоритма сравнения значений этих параметров и выдаче в качестве результата значения, по которому метод sort будет определять, переставлять эти элементы массива или нет.

Т.е. метод sort определяет, переставлять элементы или нет в зависимости от результата, которая возвращает данная функция. Рассмотрим, какие значения должна возвращать функция:

  • Если функция возвращает 0, то данные элементы массива равны;
  • Если функция возвращает 1 (или больше 0), то это означает что первый элемент массива больше второго;
  • Если функция возвращает -1 (или меньше 0), то это означает что второй элемент массива больше первого.

После создания функции, её необходимо передать в качестве параметра методу sort . Причём передавать необходимо только название этой функции, без заключения её в кавычки и без указания круглых скобочек. Это всё объясняется тем, что мы не просим метод sort вызвать эту функцию прямо сейчас, а просто сообщаем данному методу, чтоб он именно её использовал при сравнении элементов массива, т.е. как бы подменяем его стандартную функцию для сортировки массива на функцию, заданную ему в качестве параметра.

Например, напишем функцию для сортировки чисел:

//Функция для сравнения чисел, которая возвращает: // 0 - числа равны; // 1 - первое число больше второго числа // -1 - второе число больше первого числа function compareNumbers(n1,n2) { if (n1==n2) return 0; if (n1>n2) return 1; else return -1; } var arrNumbers = new Array (50,4,1,76,20,3,27,5,501); document.write("Исходный массив:"); document.write("
"); document.write(arrNumbers.join(", ")); document.write("

"); document.write(arrNumbers.join(", "));

Таким образом, используя специальную функцию, Вы можете заставить метод sort отсортировать массив по указанному в данной функции алгоритму.

Например, сортировка числового массива в обратном порядке:

//Функция для сравнения чисел, которая возвращает: // 0 - числа равны; // 1 - первое число больше второго числа // -1 - второе число больше первого числа function compareNumbers(n1,n2) { if (n1==n2) return 0; if (n1