Warum sortieren manche Sortiermethoden nach 1, 10, 2, 3…?


30

Es ist mir aufgefallen, dass viele numerische Sortiermethoden nach 1, 10, 2, 3 zu sortieren scheinen ... anstatt nach den erwarteten 1, 2, 3, 10 ... Ich habe Probleme, ein Szenario zu finden, in dem ich es tun würde Ich brauche die erste Methode und als Benutzer bin ich immer frustriert, wenn ich sie in der Praxis sehe. Gibt es legitime Anwendungsfälle für den ersten Stil gegenüber dem zweiten? Wenn ja, was sind sie? Wenn nicht, wie ist der erste Sortierstil überhaupt entstanden? Was sind die offiziellen Namen für jede Sortiermethode?


Keine Antwort auf Ihre Frage, aber wenn Sie eine Liste von Zeichenfolgen sortieren müssen, die Zahlen enthalten könnten, möchten Sie wahrscheinlich den Alphanum-Algorithmus verwenden: davekoelle.com/alphanum.html
TehShrike

Es ist sehr sehr einfach. Beim Sortieren scannt der Algorithmus von links nach rechts. Also, wenn es um eine 1 und eine 5 geht, ist die 5 größer, und es ist einfach dumm, wenn die 1 tatsächlich Teil einer größeren Zahl wie 134234 ist. Um zu wissen, dass 134234 größer als 5 ist, müssen wir tatsächlich scannen Nach der Zahl bis zur letzten Ziffer (tatsächlich der ersten Ziffer) 4 arbeiten Sie dann rückwärts und stellen sicher, dass die eine tatsächlich eine 100000 ist, die viel größer als 5 ist. Ihre typische blinde Sortierung tut dies also nicht, da sie nur Zeichen mit vergleicht Zeichen, das ignoriert, was nach (oder vor) dem Vergleich vorkommt.
AbstractDissonance

1
Wenn Sie en.wikipedia.org/wiki/Natural_sort_order lesen , sollte dies Sinn machen. In natürlicher Reihenfolge werden Ziffernfolgen als ein einzelnes "Zeichen" gruppiert. Nicht physisch, nur logisch, damit wir immer noch Zeichenvergleiche durchführen können, wie im ersten Fall, aber wir können ganzzahlige Zeichenfolgen mit ganzzahligen Zeichenfolgen vergleichen, anstatt Zeichen mit Zeichen, wodurch wir den vollständigen Wert vergleichen können. Alle Arten sollten so sein, weil dies die Art ist, wie wir Menschen Dinge lesen (für Zahlen lesen wir tatsächlich von rechts nach links, sogar in einer Zeichenfolge von links nach rechts 1234 = 1000 + 200 + 30 + 4, nicht 4000 + 300 + 20 +) 1
AbstractDissonance

Antworten:


62

das ist lexikografische Sortierung, was bedeutet, dass die Sprache die Variablen als Zeichenfolgen behandelt und Zeichen für Zeichen vergleicht ( "200"ist größer als "19999"weil '2'ist größer als '1')

Um dies zu beheben, können Sie

  • stellen Sie sicher, dass die Werte als ganze Zahlen behandelt werden,

  • Voranstellen '0'der Zeichenfolgen, damit alle die gleiche Länge haben (nur möglich, wenn Sie den Maximalwert kennen).
    Aus diesem Grund werden in Mediendateien (S1E01) mit einer vorangestellten 0 Episodennummern angezeigt, damit bei einer lexikografischen Sortierung nichts durcheinander kommt und Programme einfach in alphabetischer Reihenfolge abgespielt / angezeigt werden können.

  • oder erstellen Sie einen benutzerdefinierten Komparator, der zuerst die Länge der Zeichenfolgen vergleicht (kürzere Zeichenfolgen sind kleinere Ganzzahlen) und wenn sie gleich sind, die lexikografische (vorsichtige Führung '0')


5
+1 für 'lexiografisch'. Hätte ich diesen Begriff noch nicht gehört, hätte ich ihn mir nur als alphabetische Sortierung vorgestellt - die Zahlen werden, wie Sie sagten, als Zeichenfolgentyp behandelt.
Anonym

3
+1, um '0' vor die Zeichenketten zu setzen. Ich habe das nicht programmiert, es war im Namen meiner Ordner und 'Kapitel 10' stand vor 'Kapitel 2'. Dann habe ich die Kapitel 1-9 mit dem Namen 01-09 erstellt und sie sind jetzt "richtig" sortiert.
Marvin

6

Alphabetisch kommt 1 vor 2. Wenn Sie die erste Methode sehen, liegt dies nicht daran, dass sie wünschenswert ist, sondern daran, dass die Sortierung streng alphabetisch ist (und von links nach rechts, jeweils ein Zeichen): 1, 2, 10 ist sinnvoll für Sie, aber nicht für einen Computer, der nur alphabetische Vergleiche kennt. In solch einem einfachen Vergleich ist es unmöglich zu wissen, dass eine Eins, gefolgt von einer 0, tatsächlich nach einer Zwei kommt.

Wenn Sie eine Sortierung mit gemischten Wörtern und Zahlen sehen, die Zahlen korrekt behandelt, liegt dies daran, dass die Sortierung intelligenter ist und darüber hinaus in der Regel nur am Anfang oder Ende einer Zeichenfolge funktioniert.


4

Das ist das Ergebnis, wenn Sie Zahlenfolgen alphabetisch statt numerisch sortieren.

Dieser Sortierstil ist beispielsweise das Standardverhalten des Unix- sortBefehls, es sei denn, Sie verwenden die --numeric-sortBefehlszeilenoption, mit der versucht wird, die numerischen Werte zu interpretieren.


4

Andere haben Antworten, was diese Art ist, aber niemand hat Ihre Frage, warum Sie sie sehen, wirklich beantwortet. Die Antwort ist nicht wirklich aufregend. Es ist normalerweise ein Fehler. Die meisten Sortiermethoden sind standardmäßig auf die eine oder andere Art eingestellt, und die Programmierung achtet wahrscheinlich nicht darauf, die Standardeinstellung beim Sortieren von Zahlen zu ändern.


In gemischten alphabetischen / numerischen Kontexten bevorzugen erfahrene Benutzer die lexiografische Sortierung, da sie konsistent und vorhersehbar ist. Jede App, die versucht, lexiografische und numerische Sortierung "intelligent" zu mischen, macht dies ein bisschen anders und macht die Art von fragwürdigem Nutzen.
3.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.