Алгоритм функции JavaScript «sort ()»

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


Выходные данные тогда выглядят так: -

1,5,10,25,40,100

Теперь я не понял, почему это происходит, и может кто-нибудь, пожалуйста, подробно расскажите, какой тип алгоритма используется в этом " sort () " функция? Это связано с тем, что для любого другого языка я не нашел этой проблемы, когда функция неправильно сортировала числа .

Любая помощь очень ценится.

15
задан Knowledge Craving 29 April 2012 в 13:53
поделиться

6 ответов

Что ж, если вы сортируете следующий список, он содержит только строки:

var n = ["10", "5", "40", "25", "100", "1"];

Поэтому я ожидаю, что любой язык будет сравнивать их как строки, что приведет к порядку сортировки:

var n = ["1", "10", "100", "25", "40", "5"];

Это требует, чтобы ваш код использовал настраиваемую сортировку (как вы это сделали), чтобы вернуть строки к целым числам для целей сортировки.

Изменить

Как упоминал Пойнти, по умолчанию метод JavaScript sort () сортирует элементы в алфавитном порядке, включая числа:

По умолчанию метод sort () сортирует элементы по алфавиту и по возрастанию. Однако числа не будут отсортированы правильно (40 идет раньше 5). Для сортировки чисел необходимо добавить функцию сравнения чисел.

Просто потрясающе ... поэтому даже для массива целых чисел требуется специальная сортировка.

14
ответ дан 1 December 2019 в 00:05
поделиться

Вы можете делегировать сортировку своей собственной функции сортировки:

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"]
2
ответ дан 1 December 2019 в 00:05
поделиться

А что, если ваш n определяется как:

var n = [10, 5, 40, 25, 100, 1]; 
0
ответ дан 1 December 2019 в 00:05
поделиться

Сортировка Javascript по умолчанию лексикографическая и алфавитная. Таким образом, как я понимаю, каждый элемент рассматривается как строка. Скорее всего, внутренний алгоритм сортировки - это быстрая сортировка или сортировка слиянием. Чтобы иметь возможность использовать быструю сортировку, вам нужно иметь возможность связывать элементы друг с другом, больше, чем b? В случае строки такой порядок уже реализован.

Поскольку вы можете захотеть отсортировать свои пользовательские типы данных и т. Д., Вы можете предоставить функционал, определяющий, как упорядочить два элемента.

Из вашего примера ваш функционал определяет порядок двух чисел a и b. Затем сортировка Javascript использует вашу функцию, сообщающую sort, как упорядочить элементы.

Оказывается, сортировка слиянием используется Mozilla, посмотрите: Реализация Javascript Array.sort?

6
ответ дан 1 December 2019 в 00:05
поделиться

Проблема заключается в использовании строк для представления чисел, что, к сожалению, выполняет функция сортировки по умолчанию. Строки отсортированы по алфавиту. Функция сравнения в вашем коде просто заставляет строки оцениваться как числа.

Я считаю очень плохим дизайном API, что функция сортировки по умолчанию обрабатывает элементы как строки, но это может быть необходимо, учитывая свободную систему типов JavaScript.

5
ответ дан 1 December 2019 в 00:05
поделиться

Функция sort отсортирует ваш массив в алфавитном порядке сортировки , даже если он состоит из целых чисел; вот почему ваш массив сортируется таким образом, вызывая sort без параметра.

sortOrder - функция сравнения, которая используется для определения нового порядка сортировки для массива; эта функция вернет

  • 0 , если a и b имеют одинаковое значение
  • a значение > 0 , если a имеет большее значение, чем b
  • a значение <0 , если a имеет меньшее значение, чем b

В JavaScript , «1» - «2» вернет -1 , которое является числом, а не строкой; используя функцию сравнения sortOrder в вашем массиве, состоящем из чисел, заключенных в строки , вы упорядочиваете массив в числовом порядке сортировки , в результате чего получается 1,5,10,25,40,100 , а не в 1,10,100,25,40,5

5
ответ дан 1 December 2019 в 00:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: