一部の並べ替え方法が1、10、2、3…で並べ替えられるのはなぜですか?


30

多くの数値ソート方法が、予想される1、2、3、10ではなく、1、10、2、3 ...でソートされるように見えることに気づきました。最初の方法が必要であり、ユーザーとして、実際にそれを見るたびにイライラします。最初のスタイルと2番目のスタイルの合法的な使用例はありますか?もしそうなら、彼らは何ですか?そうでない場合、最初のソートスタイルはどのようにして生まれましたか?各ソート方法の正式名称は何ですか?


あなたの質問への答えではありませんが、数字を含む可能性のある文字列のリストをソートする必要がある場合は、Alphanumアルゴリズムを使用することをお勧めします。davekoelle.com
TehShrike

とても簡単です。ソート時に、アルゴリズムは左から右にスキャンします。したがって、1と5になると5が大きくなり、1が実際に134234のようなより大きな数の一部である場合でも、このEVENにばかばかしくなります。134234が5より大きいことを知るには、実際にスキャンする必要があります数字を過ぎて最後の数字(実際は最初の数字)4に戻り、1が実際には100000であり、5よりもはるかに大きいことを確認します。したがって、通常のブラインドソートは、文字を比較するだけなので、これを行いません。比較の後(または前)に発生することを無視する文字。
AbstractDissonance

1
en.wikipedia.org/wiki/Natural_sort_orderを読めば、それは理にかなっているはずです。自然な順序では、数字の文字列は単一の「文字」としてグループ化されます。物理的ではなく論理的であるため、最初のケースのように文字比較を行うことができますが、整数文字列を文字対文字ではなく整数文字列と比較することができ、これにより完全な値を比較することができます。これは人間が物事を読む方法であるため、すべての並べ替えはこのようにする必要があります(数字の場合、実際には右から左の文字列でも、1234 = 1000 + 200 + 30 + 4ではなく、4000 + 300 + 20 + 1
AbstractDissonance

回答:


62

これは辞書式ソートであり、基本的に言語は変数を文字列として扱い、文字ごとに比較します("200"より大きい"19999"ため'2'、より大きい'1'

これを修正するには

  • 値が整数として扱われるようにします。

  • '0'すべてが同じ長さになるように文字列の先頭に追加します(最大値がわかっている場合にのみ実行可能)。
    これが、0が先頭に追加されたメディアファイル(S1E01)にエピソード番号が表示される理由です。これにより、辞書式ソートが混乱することなく、プログラムをアルファベット順で単純に再生/表示できます。

  • または、最初に文字列の長さを比較するカスタムコンパレータを作成し(短い文字列は小さい整数)、それらが等しい場合は辞書的に比較します(先頭に注意してください'0'


5
「辞書」の場合は+1。その言葉を聞いたことがない、私はちょうどこれをアルファベット順のソートと考えていたでしょう-あなたが言ったように、数字は文字列型として扱われています。
匿名

3
文字列の先頭に「0」を追加する場合は+1。私はこれをプログラミングしていませんでした。それは私のフォルダの名前であり、「第2章」の前に「第10章」が来ていました。次に、01-09と呼ばれる1〜9章を作成しましたが、現在は「正しく」ソートされています。
マービン

6

アルファベット順、1あなたが最初の方法を見るたびに、それは望ましいですので、それはないですが、ソートは厳密にアルファベット順であるため、(左から右へhappensが、1文字ずつ)2.前に来る:1、2、10は理にかなっていますアルファベットの比較のみを知っているコンピュータではなく、あなたに。そのような単純な比較では0続くものが実際に2のに来ることを知る方法はありません。

数字を正しく処理する単語と数字の混在した並べ替えが表示される場合、並べ替えがよりインテリジェントであり、さらに、通常は文字列の先頭または末尾でのみ機能するためです。


4

これは、数値の文字列を数値ではなくアルファベット順に並べ替えた場合の結果です。

sortたとえば、--numeric-sort数値の解釈を試みるように指示するコマンドラインオプションを使用しない限り、このソートスタイルはunix コマンドのデフォルトの動作です。


4

他の人はこの種の答えを持っていますが、誰もあなたがそれを見る理由についてあなたの質問に本当に答えていません。答えは本当にエキサイティングではありません。通常はバグです。ほとんどの並べ替え方法はどちらか一方にデフォルト設定され、プログラミングはおそらく数字を並べ替えるときにデフォルトを変更することに不注意になります。


アルファベット/数字が混在するコンテキストでは、経験豊富なユーザーは、一貫性があり予測可能なため、語彙の並べ替えを好む傾向があります。「インテリジェントに」字句解析と数値の並べ替えを混在させようとするアプリはすべて、少し異なる方法で行われるため、一種の疑わしいユーティリティになります。
j__m
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.