Недавно, когда я работал с функцией JavaScript "sort ()", я обнаружил в одном из учебных пособий , что эта функция не сортирует номера правильно. Вместо того, чтобы сортировать числа, должна быть добавлена функция, которая сравнивает числа, например, следующий код: -
Выходные данные тогда выглядят так: -
1,5,10,25,40,100
Теперь я не понял, почему это происходит, и может кто-нибудь, пожалуйста, подробно расскажите, какой тип алгоритма используется в этом " sort () " функция? Это связано с тем, что для любого другого языка я не нашел этой проблемы, когда функция неправильно сортировала числа .
Любая помощь очень ценится.
Что ж, если вы сортируете следующий список, он содержит только строки:
var n = ["10", "5", "40", "25", "100", "1"];
Поэтому я ожидаю, что любой язык будет сравнивать их как строки, что приведет к порядку сортировки:
var n = ["1", "10", "100", "25", "40", "5"];
Это требует, чтобы ваш код использовал настраиваемую сортировку (как вы это сделали), чтобы вернуть строки к целым числам для целей сортировки.
Изменить
Как упоминал Пойнти, по умолчанию метод JavaScript sort () сортирует элементы в алфавитном порядке, включая числа:
По умолчанию метод sort () сортирует элементы по алфавиту и по возрастанию. Однако числа не будут отсортированы правильно (40 идет раньше 5). Для сортировки чисел необходимо добавить функцию сравнения чисел.
Просто потрясающе ... поэтому даже для массива целых чисел требуется специальная сортировка.
Вы можете делегировать сортировку своей собственной функции сортировки:
function sortnum(a,b) {
return parseInt(a,10)-parseInt(b,10);
}
var n = ["10", "5", "40", "25", "100", "1"];
alert(n.sort(sortnum)); //=>["1", "5", "10", "25", "40", "100"]
А что, если ваш n определяется как:
var n = [10, 5, 40, 25, 100, 1];
Сортировка Javascript по умолчанию лексикографическая и алфавитная. Таким образом, как я понимаю, каждый элемент рассматривается как строка. Скорее всего, внутренний алгоритм сортировки - это быстрая сортировка или сортировка слиянием. Чтобы иметь возможность использовать быструю сортировку, вам нужно иметь возможность связывать элементы друг с другом, больше, чем b? В случае строки такой порядок уже реализован.
Поскольку вы можете захотеть отсортировать свои пользовательские типы данных и т. Д., Вы можете предоставить функционал, определяющий, как упорядочить два элемента.
Из вашего примера ваш функционал определяет порядок двух чисел a и b. Затем сортировка Javascript использует вашу функцию, сообщающую sort, как упорядочить элементы.
Оказывается, сортировка слиянием используется Mozilla, посмотрите: Реализация Javascript Array.sort?
Проблема заключается в использовании строк для представления чисел, что, к сожалению, выполняет функция сортировки по умолчанию. Строки отсортированы по алфавиту. Функция сравнения в вашем коде просто заставляет строки оцениваться как числа.
Я считаю очень плохим дизайном API, что функция сортировки по умолчанию обрабатывает элементы как строки, но это может быть необходимо, учитывая свободную систему типов JavaScript.
Функция sort
отсортирует ваш массив в алфавитном порядке сортировки , даже если он состоит из целых чисел; вот почему ваш массив сортируется таким образом, вызывая sort
без параметра.
sortOrder
- функция сравнения, которая используется для определения нового порядка сортировки для массива; эта функция вернет
0
, если a
и b
имеют одинаковое значение > 0
, если a
имеет большее значение, чем b
<0
, если a
имеет меньшее значение, чем b
В JavaScript , «1» - «2»
вернет -1
, которое является числом, а не строкой; используя функцию сравнения sortOrder
в вашем массиве, состоящем из чисел, заключенных в строки , вы упорядочиваете массив в числовом порядке сортировки , в результате чего получается 1,5,10,25,40,100
, а не в 1,10,100,25,40,5