Mengapa beberapa metode penyortiran mengurutkan berdasarkan 1, 10, 2, 3 ...?

31

Saya perhatikan dari banyak metode penyortiran numerik yang kelihatannya mengurutkan berdasarkan 1, 10, 2, 3 ... daripada yang diharapkan 1, 2, 3, 10 ... Saya mengalami masalah dengan skenario di mana saya akan memerlukan metode pertama dan, sebagai pengguna, saya merasa frustrasi setiap kali saya melihatnya dalam praktek. Apakah ada kasus penggunaan yang sah untuk gaya pertama di atas yang kedua? Jika demikian, apakah mereka? Jika tidak, bagaimana gaya sortir pertama muncul? Apa nama resmi untuk setiap metode pengurutan?

VirtuosiMedia
sumber
Bukan jawaban untuk pertanyaan Anda, tetapi jika Anda harus mengurutkan daftar string yang dapat berisi angka, Anda mungkin ingin menggunakan algoritma Alphanum: davekoelle.com/alphanum.html
TehShrike
Ini sangat sangat sederhana. Saat menyortir, algoritme memindai dari kiri ke kanan. Jadi, ketika sampai pada angka 1 dan 5, angka 5 lebih besar, dan itu dengan bodohnya berlaku dengan BAHKAN ini jika angka 1 sebenarnya merupakan bagian dari angka yang lebih besar seperti 134234. Untuk mengetahui bahwa 134234 lebih besar dari 5 kita harus benar-benar memindai melewati angka ke digit terakhir (sebenarnya digit pertama) 4 kemudian bekerja mundur dan melihat bahwa yang sebenarnya adalah 100000 yang jauh lebih besar dari 5. Jadi, jenis buta Anda tidak melakukan ini karena hanya membandingkan karakter dengan karakter mengabaikan apa yang terjadi setelah (atau sebelum) dalam perbandingan.
AbstractDissonance
1
Jika Anda membaca en.wikipedia.org/wiki/Natural_sort_order seharusnya masuk akal. Dalam urutan alami, deretan digit dikelompokkan sebagai "karakter" tunggal. Tidak secara fisik, hanya secara logis sehingga kita masih bisa mengurutkan perbandingan karakter seperti kasus pertama, tetapi kita akan dapat membandingkan string integer ke string integer daripada karakter ke karakter, yang akan memungkinkan kita untuk membandingkan nilai penuh. Segala macam harus seperti ini karena ini adalah cara kita manusia membaca sesuatu (untuk angka, kita sebenarnya membaca dari kanan ke kiri, bahkan dalam string kiri ke kanan 1234 = 1000 + 200 + 30 + 4, bukan 4000 + 300 + 20 + 1
AbstractDissonance

Jawaban:

63

yaitu penyortiran leksikografis yang pada dasarnya berarti bahasa memperlakukan variabel sebagai string dan membandingkan karakter dengan karakter ( "200"lebih besar daripada "19999"karena '2'lebih besar dari '1')

untuk memperbaikinya Anda bisa

  • memastikan bahwa nilai-nilai diperlakukan sebagai bilangan bulat,

  • tambahkan '0'ke string sehingga semua memiliki panjang yang sama (hanya layak bila Anda tahu nilai maks).
    Inilah sebabnya mengapa Anda akan melihat penomoran episode pada file media (S1E01) dengan 0 diawali sehingga jenis leksikografis tidak mengacaukan segalanya dan memungkinkan program untuk hanya memutar / menampilkan dalam urutan abjad,

  • atau buat pembanding khusus yang pertama kali membandingkan panjang string (string lebih pendek menjadi bilangan bulat lebih kecil) dan ketika mereka sama, bandingkan secara leksikografis (hati-hati tentang memimpin '0')

ratchet freak
sumber
5
+1 untuk 'lexiographic'. Belum pernah mendengar istilah itu, saya hanya akan menganggap ini sebagai penyortiran alfabet - angka-angka tersebut diperlakukan sebagai tipe string, seperti yang Anda katakan.
Anonim
3
+1 untuk prepend '0' ke string. Saya tidak memprogram ini, itu atas nama folder saya dan 'Bab 10' datang sebelum 'Bab 2'. Kemudian saya membuat bab 1-9 bernama 01-09 dan diurutkan "dengan benar" sekarang.
Marvin
6

Secara alfabet, 1 muncul sebelum 2. Setiap kali Anda melihat metode pertama, itu bukan karena diinginkan, tetapi karena penyortirannya sangat abjad (dan terjadi kiri-ke-kanan, satu karakter pada satu waktu): 1, 2, 10 masuk akal untuk Anda tetapi tidak ke komputer yang hanya tahu perbandingan alfabet. Tidak ada cara dalam perbandingan sederhana semacam itu untuk mengetahui bahwa yang diikuti oleh 0 benar-benar muncul setelah dua.

Ketika Anda melihat pengurutan kata dan angka campuran yang memperlakukan angka dengan benar, itu karena pengurutan lebih cerdas, dan di atas itu, masih biasanya hanya bekerja di awal atau akhir string.

Nicole
sumber
4

Itulah hasilnya ketika Anda mengurutkan string angka secara alfabet dan bukan angka.

Gaya semacam itu adalah perilaku default dari sortperintah unix misalnya, kecuali jika Anda menggunakan --numeric-sortopsi baris perintah, yang memberitahukannya untuk mencoba menafsirkan nilai numerik.

Apa namanya
sumber
4

Orang lain memiliki jawaban apa ini, tetapi tidak ada yang benar-benar menjawab pertanyaan Anda tentang mengapa Anda melihatnya. Jawabannya tidak terlalu menarik. Biasanya bug. Sebagian besar metode penyortiran akan default ke satu atau yang lain dan pemrograman cenderung ceroboh mengubah default saat menyortir angka.

frankc
sumber
Dalam konteks alfabet / numerik campuran, pengguna yang berpengalaman akan cenderung memilih penyortiran leksiografis, karena konsisten dan dapat diprediksi. Setiap aplikasi yang mencoba "secara cerdas" mencampur penyortiran lexiografis dan numerik melakukannya sedikit berbeda, membuat jenis utilitas yang dipertanyakan.
j__m