Pourquoi certaines méthodes de tri trient-elles par 1, 10, 2, 3…?

31

J'ai remarqué que de nombreuses méthodes de tri numérique semblent trier par 1, 10, 2, 3 ... plutôt que les 1, 2, 3, 10 attendus ... J'ai du mal à trouver un scénario où je le ferais J'ai besoin de la première méthode et, en tant qu'utilisateur, je suis frustré chaque fois que je la vois dans la pratique. Existe-t-il des cas d'utilisation légitimes pour le premier style par rapport au second? Si c'est vrai, que sont-ils? Sinon, comment est né le premier style de tri? Quels sont les noms officiels de chaque méthode de tri?

VirtuosiMedia
la source
Pas une réponse à votre question, mais si vous devez trier une liste de chaînes pouvant contenir des nombres, vous voudrez probablement utiliser l'algorithme Alphanum: davekoelle.com/alphanum.html
TehShrike
C'est très très simple. Lors du tri, l'algorithme balaye de gauche à droite. Donc, quand il s'agit d'un 1 et d'un 5, le 5 est plus grand, et cela va simplement de pair avec ce MÊME si le 1 fait en fait partie d'un plus grand nombre comme 134234. Pour savoir que 134234 est plus grand que 5, nous devons réellement scanner passé le nombre jusqu'au dernier chiffre (en fait le premier chiffre) 4 puis travaillez en arrière et voyez que celui-ci est en fait un 100000 qui est beaucoup plus grand que 5. Donc, votre tri aveugle typique ne fait pas cela car il compare simplement le caractère à caractère ignorant ce qui se passe après (ou avant) dans la comparaison.
AbstractDissonance
1
Si vous lisez en.wikipedia.org/wiki/Natural_sort_order, cela devrait avoir du sens. Dans l'ordre naturel, les chaînes de chiffres sont regroupées en un seul "caractère". Pas physiquement, juste logiquement afin que nous puissions toujours avoir des comparaisons de caractères comme le premier cas, mais nous serons en mesure de comparer des chaînes entières à des chaînes entières plutôt que des caractères à des caractères, ce qui nous permettra de comparer la valeur complète. Toutes les sortes devraient être ainsi parce que c'est ainsi que nous, les humains, lisons les choses (pour les nombres, nous lisons en fait de droite à gauche, même dans une chaîne de gauche à droite 1234 = 1000 + 200 + 30 + 4, pas 4000 + 300 + 20 + 1
AbstractDissonance

Réponses:

63

c'est-à-dire le tri lexicographique qui signifie fondamentalement que la langue traite les variables comme des chaînes et compare caractère par caractère ( "200"est supérieur à "19999"parce '2'que supérieur à '1')

pour résoudre ce problème, vous pouvez

  • s'assurer que les valeurs sont traitées comme des entiers,

  • ajouter '0'aux chaînes de sorte que toutes aient des longueurs égales (viable uniquement lorsque vous connaissez la valeur maximale).
    C'est pourquoi vous verrez les numérotations des épisodes sur les fichiers multimédias (S1E01) avec un 0 ajouté afin qu'un tri lexicographique ne gâche pas les choses et permette aux programmes de simplement jouer / s'afficher dans l'ordre alphabétique,

  • ou créez un comparateur personnalisé qui compare d'abord la longueur des chaînes (les chaînes plus courtes étant des entiers plus petits) et quand elles sont égales, comparez le lexicographiquement (faites attention au début '0')

monstre à cliquet
la source
5
+1 pour «lexiographique». Je n'ai jamais entendu ce terme, j'aurais simplement pensé à cela comme un tri alphabétique - les nombres sont traités comme un type de chaîne, comme vous l'avez dit.
Anonyme
3
+1 pour ajouter «0» aux chaînes. Je ne programmais pas cela, c'était au nom de mes dossiers et 'Chapter 10' venait avant 'Chapter 2'. Ensuite, j'ai fait les chapitres 1-9 appelés 01-09 et ils sont triés "correctement" maintenant.
Marvin
6

Par ordre alphabétique, 1 précède 2. Chaque fois que vous voyez la première méthode, ce n'est pas parce qu'elle est souhaitable, mais parce que le tri est strictement alphabétique (et se fait de gauche à droite, un caractère à la fois): 1, 2, 10 est logique à vous mais pas à un ordinateur qui ne connaît que la comparaison alphabétique. Il n'y a aucun moyen dans ce genre de comparaison simple de savoir qu'un un suivi d'un 0 vient en fait après un deux.

Lorsque vous voyez un tri mixte de mots et de nombres qui traite correctement les nombres, c'est parce que le tri est plus intelligent, et en plus de cela, il ne fonctionne généralement qu'au début ou à la fin d'une chaîne.

Nicole
la source
4

C'est le résultat lorsque vous triez des chaînes de chiffres par ordre alphabétique plutôt que numérique.

Ce style de tri est le comportement par défaut de la sortcommande unix par exemple, sauf si vous utilisez l' --numeric-sortoption de ligne de commande, qui lui dit d'essayer d'interpréter les valeurs numériques.

comment s'appelle-t-il
la source
4

D'autres ont des réponses sur ce type, mais personne n'a vraiment répondu à votre question sur la raison pour laquelle vous le voyez. La réponse n'est pas vraiment passionnante. C'est généralement un bug. La plupart des méthodes de tri seront par défaut l'une ou l'autre et la programmation sera probablement insouciante de changer la valeur par défaut lors du tri des nombres.

Frankc
la source
Dans des contextes alphabétiques / numériques mixtes, les utilisateurs expérimentés auront tendance à préférer le tri lexographique, car il est cohérent et prévisible. Chaque application qui essaie de mélanger «intelligemment» le tri lexographique et numérique le fait un peu différemment, ce qui rend le genre d'utilité discutable.
j__m