Чому деякі способи сортування сортують за 1, 10, 2, 3…?


31

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


Не відповідь на ваше запитання, але якщо вам доведеться сортувати список рядків, які могли б містити числа, ви, ймовірно, хочете скористатися алгоритмом Alphanum: davekoelle.com/alphanum.html
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

Це результат, коли ви сортуєте рядки чисел за алфавітом, а не числом.

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


4

В інших є відповіді, що це за сорт, але ніхто не реально відповів на ваше запитання про те, чому ви це бачите. Відповідь насправді не така захоплююча. Зазвичай це помилка. Більшість методів сортування за замовчуванням застосовуються до одного чи іншого, а програмування, ймовірно, недбало змінювати типовий параметр при сортуванні чисел.


У змішаному алфавітному чисельному контексті досвідчені користувачі, як правило, віддають перевагу лексиографічному сортуванню, оскільки це послідовне та передбачуване. Кожен додаток, який намагається "інтелектуально" змішати лексиографічне та числове сортування, робить це трохи інакше, роблячи подібну сумнівну корисність.
j__m
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.