ทำไมวิธีการเรียงลำดับบางอย่างจึงจัดเรียง 1, 10, 2, 3 …?


30

ฉันสังเกตเห็นมากกว่าวิธีการเรียงลำดับตัวเลขหลายวิธีดูเหมือนจะเรียงลำดับตาม 1, 10, 2, 3 ... แทนที่จะเป็น 1, 2, 3, 10 ... ฉันมีปัญหาในการหาสถานการณ์ที่ฉันต้องการ ต้องการวิธีแรกและในฐานะผู้ใช้ฉันรู้สึกหงุดหงิดเมื่อใดก็ตามที่ฉันเห็นมันในทางปฏิบัติ มีกรณีการใช้งานที่ถูกกฎหมายสำหรับรูปแบบแรกในช่วงที่สองหรือไม่ ถ้าเป็นเช่นนั้นพวกเขาคืออะไร? ถ้าไม่ใช่สไตล์การเรียงลำดับแรกจะเกิดขึ้นได้อย่างไร ชื่ออย่างเป็นทางการของแต่ละวิธีการเรียงลำดับคืออะไร?


ไม่ใช่คำตอบสำหรับคำถามของคุณ แต่ถ้าคุณต้องเรียงลำดับรายการของสตริงที่อาจมีตัวเลขคุณอาจต้องการใช้อัลกอริทึม Alphanum: davekoelle.com/alphanum.html
TehShrike

มันง่ายมาก เมื่อเรียงลำดับอัลกอริทึมจะสแกนจากซ้ายไปขวา ดังนั้นเมื่อมันมาถึง 1 และ 5, 5 มีขนาดใหญ่ขึ้นและมันก็โง่ไปกับ EVEN นี้ถ้า 1 เป็นส่วนหนึ่งของจำนวนที่มากขึ้นเช่น 134234 หากต้องการทราบว่า 134234 นั้นมีขนาดใหญ่กว่า 5 เราต้องสแกนจริง ผ่านตัวเลขไปที่ตัวเลขสุดท้าย (จริง ๆ แล้วหลักแรก) 4 จากนั้นทำงานไปข้างหลังและดูว่าอันที่จริงแล้วคือ 100,000 ซึ่งมีขนาดใหญ่กว่า 5 ดังนั้นการจัดเรียงคนตาบอดทั่วไปของคุณจึงไม่ทำเช่นนี้ อักขระที่ไม่สนใจสิ่งที่เกิดขึ้นหลังจาก (หรือก่อนหน้า) ในการเปรียบเทียบ
AbstractDissonance

1
หากคุณอ่านen.wikipedia.org/wiki/Natural_sort_orderมันควรสมเหตุสมผล ตามลำดับธรรมชาติสตริงของตัวเลขจะถูกจัดกลุ่มเป็น "อักขระ" เดียว ไม่ใช่ทางกายภาพเพียงแค่มีเหตุผลเพื่อให้เรายังสามารถเรียงลำดับของการเปรียบเทียบตัวละครเช่นกรณีแรก แต่เราจะสามารถเปรียบเทียบสตริงจำนวนเต็มกับสตริงจำนวนเต็มมากกว่าตัวอักษรกับตัวละครซึ่งจะช่วยให้เราสามารถเปรียบเทียบค่าเต็ม ทุกประเภทควรเป็นแบบนี้เพราะนี่คือวิธีที่มนุษย์เราอ่านสิ่งต่าง ๆ (สำหรับตัวเลขเราอ่านจากขวาไปซ้ายจริง ๆ แม้ในสตริงซ้ายไปขวา 1234 = 1,000 + 200 + 30 + 4 ไม่ใช่ 4000 + 300 + 20 + 1
AbstractDissonance

คำตอบ:


62

นั่นคือการเรียงลำดับพจนานุกรมซึ่งหมายความว่าโดยทั่วไปภาษาจะปฏิบัติต่อตัวแปรเป็นสตริงและเปรียบเทียบอักขระตามตัวอักษร ( "200"มากกว่า"19999"เพราะ'2'มากกว่า'1')

เพื่อแก้ไขปัญหานี้คุณทำได้

  • ตรวจสอบให้แน่ใจว่าค่านั้นถูกใช้เป็นจำนวนเต็ม

  • เติม'0'สตริงเพื่อให้ทุกคนมีความยาวเท่ากัน (ใช้ได้เฉพาะเมื่อคุณทราบค่าสูงสุด)
    นี่คือเหตุผลที่คุณจะเห็นหมายเลขตอนของไฟล์สื่อ (S1E01) ที่มีค่าที่เติมไว้ 0 เพื่อให้การเรียงลำดับพจนานุกรมไม่ทำให้เกิดปัญหาและอนุญาตให้โปรแกรมเล่น / แสดงตามลำดับตัวอักษร

  • หรือสร้างเครื่องมือเปรียบเทียบแบบกำหนดเองที่เปรียบเทียบความยาวของสตริงก่อน (สตริงที่สั้นกว่าจะเป็นจำนวนเต็มน้อยกว่า) และเมื่อเปรียบเทียบกันแล้วจะต้องเปรียบเทียบ lexicographically (ระวังการเป็นผู้นำ'0')


5
+1 สำหรับ 'lexiographic' ไม่เคยได้ยินคำว่าฉันจะคิดว่านี่เป็นการเรียงลำดับตามตัวอักษร - ตัวเลขกำลังถูกถือว่าเป็นประเภทสตริงเช่นที่คุณพูด
ไม่ระบุชื่อ

3
+1 สำหรับการเติม '0' ให้กับสตริง ฉันไม่ได้เขียนโปรแกรมนี้มันอยู่ในชื่อของโฟลเดอร์ของฉันและ 'บทที่ 10' มาก่อน 'บทที่ 2' จากนั้นฉันก็ทำบทที่ 1-9 เรียกว่า 01-09 และตอนนี้มันถูกเรียงลำดับ "ถูกต้อง" แล้ว
Marvin

6

ตามลำดับตัวอักษร 1 มาก่อน 2. เมื่อใดก็ตามที่คุณเห็นวิธีแรกก็ไม่ได้เพราะมันเป็นที่พึงปรารถนา แต่เป็นเพราะการจัดเรียงเป็นตัวอักษรอย่างเคร่งครัด (และเกิดขึ้นจากซ้ายไปขวาตัวละครตัวหนึ่งในเวลา): 1, 2, 10ทำให้รู้สึก ถึงคุณ แต่ไม่ใช่กับคอมพิวเตอร์ที่รู้เฉพาะการเปรียบเทียบด้วยตัวอักษรเท่านั้น ไม่มีวิธีใดในการเปรียบเทียบแบบง่าย ๆ ที่จะรู้ว่าหนึ่งตามด้วย0จริง ๆ แล้วมาหลังจากสอง

เมื่อคุณเห็นคำที่เรียงกันและการเรียงลำดับตัวเลขที่จัดการกับตัวเลขอย่างถูกต้องนั่นเป็นเพราะการเรียงลำดับนั้นฉลาดกว่าและเหนือกว่านั้นมักจะใช้ได้เฉพาะที่จุดเริ่มต้นหรือจุดสิ้นสุดของสตริง


4

นั่นเป็นผลลัพธ์เมื่อคุณเรียงลำดับสตริงตัวเลขตามตัวอักษรแทนที่จะเป็นตัวเลข

ลักษณะการเรียงลำดับนั้นเป็นพฤติกรรมเริ่มต้นของsortคำสั่งunix ตัวอย่างเช่นหากคุณไม่ใช้--numeric-sortตัวเลือกบรรทัดคำสั่งซึ่งจะบอกให้พยายามตีความค่าตัวเลข


4

คนอื่นมีคำตอบว่าประเภทนี้คืออะไร แต่ไม่มีใครตอบคำถามของคุณเกี่ยวกับสาเหตุที่คุณเห็น คำตอบนั้นช่างน่าตื่นเต้นจริงๆ มันมักจะเป็นข้อผิดพลาด วิธีการเรียงลำดับส่วนใหญ่จะเริ่มต้นที่หนึ่งหรืออื่น ๆ และการเขียนโปรแกรมมีความประมาทในการเปลี่ยนค่าเริ่มต้นเมื่อเรียงลำดับหมายเลข


ในบริบทผสมตามตัวอักษร / ตัวเลขผู้ใช้ที่มีประสบการณ์จะมีแนวโน้มที่จะชอบการเรียงลำดับ lexiographic เนื่องจากมีความสอดคล้องและคาดการณ์ได้ แอปทุกอันที่พยายาม "ผสมอย่างชาญฉลาด" ผสมการจัดเรียง lexiographic และตัวเลขจะแตกต่างกันเล็กน้อยทำให้การจัดเรียงของยูทิลิตี้ที่น่าสงสัย
j__m
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.