Driftsort เป็นวิธีง่ายๆในการ "เรียงลำดับ" อาเรย์ มันทำงานโดย "การเลื่อน" หรือ "การหมุน" องค์ประกอบที่อยู่ในอาร์เรย์จนกว่าอาร์เรย์จะถูกจัดเรียงหรือจนกว่าอาร์เรย์จะล้มเหลวในการเรียงลำดับ
ลองมาดูสองตัวอย่าง [10, 2, 3, 4, 7]
ก่อนพิจารณาอาร์เรย์ เนื่องจากอาร์เรย์ไม่ได้เรียงเราจึงหมุนหนึ่งครั้ง (สิ่งนี้สามารถเกิดขึ้นได้ในทั้งสองทิศทางตราบใดที่ยังคงอยู่ในทิศทางเดียวกัน) จากนั้นอาร์เรย์จะกลายเป็น:
[7, 10, 2, 3, 4]
นี่ไม่ใช่การเรียงลำดับดังนั้นเราจึงหมุนอีกครั้ง
[4, 7, 10, 2, 3]
และอีกครั้ง:
[3, 4, 7, 10, 2]
และเป็นครั้งสุดท้าย:
[2, 3, 4, 7, 10]
และมันก็จัดเรียง! ดังนั้นอาร์เรย์[10, 2, 3, 4, 7]
จึงลอยได้ นี่คือการหมุนทั้งหมดของอาเรย์เพื่อความชัดเจน:
[10, 2, 3, 4, 7]
[7, 10, 2, 3, 4]
[4, 7, 10, 2, 3]
[3, 4, 7, 10, 2]
[2, 3, 4, 7, 10]
[5, 3, 9, 2, 6, 7]
พิจารณาในขณะนี้อาร์เรย์ ดูการหมุน:
[5, 3, 9, 2, 6, 7]
[7, 5, 3, 9, 2, 6]
[6, 7, 5, 3, 9, 2]
[2, 6, 7, 5, 3, 9]
[9, 2, 6, 7, 5, 3]
[3, 9, 2, 6, 7, 5]
ไม่มีอาร์เรย์ใดที่เรียงลำดับดังนั้นอาร์เรย์[5, 3, 9, 2, 6, 7]
จึงไม่สามารถดริฟท์ได้
วัตถุประสงค์กำหนดอาเรย์ / รายการของจำนวนเต็มแบบ nonempty เป็นอินพุทให้กับโปรแกรม / ฟังก์ชั่นใช้การดริฟท์บนอินพุตและเอาท์พุตหรือส่งออกค่าเท็จ ( หรืออาเรย์ / รายการว่าง) จำนวนเต็มถูกผูกไว้กับภาษาของคุณสูงสุด / นาที แต่ต้องมีอย่างน้อย 255 สำหรับสูงสุดและ 0 สำหรับนาที
คุณอาจใช้วิธีการเรียงลำดับแบบบิวท์อิน แต่ไม่ใช่แบบบิวด์อินที่แก้ปัญหาได้
นี่คือรหัสกอล์ฟดังนั้นโปรแกรมที่สั้นที่สุดในหน่วยไบต์
กรณีทดสอบ
input => output
[1] => [1]
[5, 0, 5] => [0, 5, 5]
[3, 2, 1] => false
[0, 9, 3] => false
[1, 2, 3, 4] => [1, 2, 3, 4]
[4, 1, 2, 3] => [1, 2, 3, 4]
[0, 2, 0, 2] => false
[5, 3, 9, 2, 6, 7] => false
[0, 0, 0, 0, 0, 0, 0] => [0, 0, 0, 0, 0, 0, 0]
[75, 230, 30, 42, 50] => [30, 42, 50, 75, 230]
[255, 255, 200, 200, 203] => [200, 200, 203, 255, 255]
shiftsort
?
shift
ดำเนินการที่จะลบองค์ประกอบแรกของอาร์เรย์
sorted(l)
l+l