Почему некоторые методы сортировки сортируются по 1, 10, 2, 3…?

31

Я заметил, что многие методы числовой сортировки, кажется, сортируют по 1, 10, 2, 3 ... вместо ожидаемых 1, 2, 3, 10 ... У меня возникают проблемы при разработке сценария, в котором я бы Мне нужен первый метод, и, как пользователь, я расстраиваюсь, когда вижу его на практике. Существуют ли законные варианты использования для первого стиля над вторым? Если так, то кто они? Если нет, то как появился первый стиль сортировки? Каковы официальные названия для каждого метода сортировки?

VirtuosiMedia
источник
Не ответ на ваш вопрос, но если вам нужно отсортировать список строк, которые могут содержать числа, вы, вероятно, захотите использовать алгоритм Alphanum
TehShrike
Это очень очень просто. При сортировке алгоритм сканирует слева направо. Итак, когда дело доходит до 1 и 5, 5 больше, и он просто глупо идет с этим ДАЖЕМ, если 1 фактически является частью большего числа, такого как 134234. Чтобы знать, что 134234 больше 5, мы должны на самом деле сканировать после числа до последней цифры (на самом деле это первая цифра) 4, затем работайте в обратном направлении и увидите, что на самом деле это 100000, что намного больше 5. Итак, ваша типичная слепая сортировка не делает этого, просто сравнивает символ с символ игнорирует то, что происходит после (или до) сравнения.
AbstractDissonance
1
Если вы читаете en.wikipedia.org/wiki/Natural_sort_order, это должно иметь смысл. В естественном порядке строки цифр сгруппированы как один «символ». Не физически, просто логически, поэтому у нас все еще могут быть сравнения символов, как в первом случае, но мы сможем сравнивать целочисленные строки с целочисленными строками, а не символы с символами, что позволит нам сравнить полное значение. Все виды должны быть такими, потому что именно так мы, люди, читаем вещи (для чисел мы на самом деле читаем справа налево, даже в строке слева направо 1234 = 1000 + 200 + 30 + 4, а не 4000 + 300 + 20 + 1
AbstractDissonance

Ответы:

63

это лексикографическая сортировка, которая означает, что в основном язык обрабатывает переменные как строки и сравнивает символ за символом ( "200"больше, чем "19999"потому, что '2'больше, чем '1')

исправить это вы можете

  • убедитесь, что значения рассматриваются как целые числа,

  • Приступайте '0'к строкам, чтобы все они имели одинаковую длину (жизнеспособно, только если вы знаете максимальное значение).
    Вот почему вы увидите нумерацию эпизодов в медиа-файлах (S1E01) с добавленным 0, чтобы лексикографическая сортировка не мешала и позволяла программам просто воспроизводить / отображать в алфавитном порядке,

  • или создайте пользовательский компаратор, который сначала сравнивает длину строк (более короткие строки - меньшие целые числа) и, когда они равны, сравнивает лексикографически (осторожно с ведением '0')

чокнутый урод
источник
5
+1 за «лексикографический». Никогда не слышал этот термин, я бы просто подумал об этом как о алфавитной сортировке - числа трактуются как строковый тип, как вы сказали.
Аноним
3
+1 для добавления «0» к строкам. Я не программировал это, это было во имя моих папок, и «Глава 10» шла перед «Главой 2». Затем я сделал главы 1-9, названные 01-09, и теперь они отсортированы «правильно».
Марвин
6

В алфавитном порядке 1 предшествует 2. Всякий раз, когда вы видите первый метод, это не потому, что это желательно, а потому, что сортировка строго алфавитна (и происходит слева направо, по одному символу за раз): 1, 2, 10 имеет смысл для вас, но не для компьютера, который знает только буквенное сравнение. В таком простом сравнении нет способа узнать, что единица, за которой следует 0, на самом деле идет после двух.

Когда вы видите смешанную сортировку слов и чисел, которая правильно обрабатывает числа, это происходит потому, что сортировка более интеллектуальна, и, кроме того, обычно работает только в начале или конце строки.

Николь
источник
4

Это результат, когда вы сортируете строки чисел по алфавиту, а не по номерам.

Этот стиль сортировки является поведением по умолчанию для команды unix, sortнапример, если вы не используете параметр --numeric-sortкомандной строки, который говорит ему пытаться интерпретировать числовые значения.

как зовут
источник
4

У других есть ответы, что это за вид, но никто не ответил на ваш вопрос о том, почему вы это видите. Ответ не так уж и интересен. Обычно это ошибка. В большинстве методов сортировки по умолчанию используется один или другой, и программирование, вероятно, не заботится об изменении значения по умолчанию при сортировке чисел.

frankc
источник
В смешанном алфавитном / числовом контекстах опытные пользователи предпочитают лексикографическую сортировку, потому что она последовательна и предсказуема. Каждое приложение, которое пытается «разумно» смешать лексикографическую и числовую сортировку, делает это немного по-своему, создавая сомнительную полезность.
17