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

Содержание:
  1. Комментарии

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

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

JavaScript
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 вызвать эту функцию прямо сейчас, а просто сообщаем данному методу, чтоб он именно её использовал при сравнении элементов массива, т.е. как бы подменяем его стандартную функцию для сортировки массива на функцию, заданную ему в качестве параметра.

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

JavaScript
//Функция для сравнения чисел, которая возвращает:
//    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 отсортировать массив по указанному в данной функции алгоритму.

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

JavaScript
//Функция для сравнения чисел, которая возвращает:
//    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

Комментарии: 5

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