JavaScript - Сортировка массива с помощью функции

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

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

var arrNumbers = new Array (50,4,1,76,20,3,27,5,501);
document.write("Исходный массив:");
document.write("<br>");
document.write(arrNumbers.join(", "));
document.write("<br>");
arrNumbers.sort();
document.write("Отсортированный массив:");
document.write("<br>");
document.write(arrNumbers.join(", "));

Сортировка массива в JavaScript

Чтобы отсортировать массив так, как мы хотим, нам необходимо написать специальную функцию и передать её имя в качестве параметра методу 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("<br>");
document.write(arrNumbers.join(", "));
document.write("<br>");
arrNumbers.sort(compareNumbers);
document.write("Отсортированный массив:");
document.write("<br>");
document.write(arrNumbers.join(", "));

Сортировка массива с помощью функции в JavaScript

Таким образом, используя специальную функцию, Вы можете заставить метод 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("<br>");
document.write(arrNumbers.join(", "));
document.write("<br>");
arrNumbers.sort(compareNumbers);
document.write("Отсортированный массив:");
document.write("<br>");
document.write(arrNumbers.join(", "));

Сортировка массива в обратном порядке на языке JavaScript



   JavaScript и jQuery 0    2635 0

Комментарии (5)

  1. ываыва # 0
    itchief.ru/assets/images/tickets/2015.01/javascript_array_sort2.png 76 стоит после 501 — получается не отсортировалось
    1. Александр Мальцев # 0
      Эта сортировка массива по умолчанию, т.е. когда он представляет каждый элемент как строку.
      Если необходимо его отсортировать как числа, то необходимо создать дополнительную функцию и указать её в качестве параметра метода sort:
      // функция, которая будет определять как необходимо сортировать
      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);
      // сортировка массива с использованием фукнции compareNumbers
      arrNumbers.sort(compareNumbers);
      // вывод отсортированного массива в консоль
      console.log(arrNumbers);
      
    2. Expos # 0
      Не понимаю, как он сравнивает, вот массив — 99,23,15,44. Он берет сравнивает 23 и 13, возвращает 1, потом сравнивает к примеру 23 и 44, возвращает -1, а как он понимает, что я хочу, к примеру, в порядке возрастания выстроить? Я же не знаю, какой будет первый элемент, больше второго или меньше второго. Вот такой вариант я видел (a,b) (return a-b) типа, это означает -1 и сортировка по возрастанию. Но я ведь не могу заранее знать, что «a» будет меньше «b» и вернется -1. Или в sort() «a» всегда меньше «b» (по умолчанию)?
      1. Александр Мальцев # 0
        Сортировка массива в JavaScript осуществляется по алгоритму. В большинстве случаев – это алгоритм быстрой сортировки. Но, может быть и другой. Это зависит от браузера. Например, в Chrome используется комбинация алгоритмов быстрой сортировки и сортировки вставками.

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

        Вам необязательно знать принцип работы алгоритмов, достаточно указать условие, по которому одни элементы перемещать вправо, а другие влево. Для этого и нужна функция с двумя параметрами. В ней Вы должны указать условие, по которому JacaScript будут одни элементы перемещать вправо (>1) или влево (<1).
        Например:
        // массив, состоящий из 4 элементов
        var arr = [99,23,15,44];
        // функция для сортировки по возрастанию
        function sortUp(n1,n2) {
          return n1-n2;
        }
        // функция для сортировки по убыванию
        function sortDown(n1,n2) {
          return n2-n1;
        }
        // вывести отсортированный массив по возрастанию в консоль
        console.log(arr.sort(sortUp).join(", "));
        // вывести отсортированный массив по убыванию в консоль
        console.log(arr.sort(sortDown).join(", "));
        
      2. Expos # 0
        Ага, я примерно понял, я, в принципе, и не хотел сильно вникать в принципы быстрой сортировки. Просто почему-то нигде не пишут, что первый аргумент меньше второго, а это сразу сняло бы миллион вопросов. Хотя, наверное, это и так подразумевается, иначе функция (n1,n2)(n1-n2) не имела бы смысла)

        Вы должны авторизоваться, чтобы оставлять комментарии.