เกี่ยวกับเมธอด built in sort () ของ Python


106

อัลกอริทึมที่สร้างขึ้นในsort()วิธีการใดใน Python ใช้? เป็นไปได้ไหมที่จะดูรหัสสำหรับวิธีการนั้น?


11
แน่นอนว่าเป็นไปได้ที่จะดูรหัสสำหรับวิธีการ - Python เป็นโครงการโอเพ่นซอร์ส อย่างไรก็ตามวิธีนี้อาจนำไปใช้ใน C ดังนั้นคุณจะต้องรู้เกี่ยวกับ C สักเล็กน้อยเพื่อให้เข้าใจตรงกัน
Chris Lutz

เวอร์ชันมีความสำคัญหรือไม่?
meder omuraliev

@melder: ไม่ =) ฉันแค่อยากดูอัลกอริทึมมืออาชีพ: P @chris: ยังไง?
Johannes

3
ดาวน์โหลดซอร์สโค้ดไปยังตัวแปล Python ฉันไม่รู้ว่าพวกเขาใช้sort()วิธีการที่ไหนหรือการจัดรูปแบบให้กับล่ามคืออะไร แต่มันต้องอยู่ที่นั่นที่ไหนสักแห่งและฉันพนันได้เลยว่ามันถูกนำไปใช้ใน C สำหรับปัญหาด้านความเร็ว
Chris Lutz

นี่คือตัวอย่างของการใช้
Hari Ganesan

คำตอบ:


120

ชัวร์! รหัสอยู่ที่นี่เริ่มต้นด้วยฟังก์ชันisltและดำเนินการต่อไปสักพัก ;-) ตามความคิดเห็นของ Chris มันคือรหัส C นอกจากนี้คุณยังต้องการอ่านไฟล์ข้อความนี้สำหรับคำอธิบายที่เป็นข้อความผลลัพธ์และอื่น ๆ

หากคุณชอบอ่านโค้ด Java มากกว่าโค้ด C คุณสามารถดูการใช้งาน timsort ในและสำหรับ Java ของ Joshua Bloch (Joshua เป็นคนที่ใช้งานในปี 1997 การผสานที่แก้ไขซึ่งยังคงใช้ใน Java และใคร ๆ ก็หวังว่า Java จะ ในที่สุดก็เปลี่ยนไปใช้พอร์ต timsort ล่าสุดของเขา)

คำอธิบายบางอย่างเกี่ยวกับพอร์ต Java ของ timsort อยู่ที่นี่ความแตกต่างอยู่ที่นี่ (พร้อมตัวชี้ไปยังไฟล์ที่จำเป็นทั้งหมด) ไฟล์สำคัญอยู่ที่นี่ - FWIW ในขณะที่ฉันเป็นโปรแกรมเมอร์ C ที่ดีกว่าโปรแกรมเมอร์ Java ในกรณีนี้ฉันพบ โค้ด Java ของ Joshua สามารถอ่านได้โดยรวมมากกว่ารหัส C ของ Tim ;-)


4
@Chris "เรียกดูแหล่งที่มาของ Python" เป็นทางลัดในแถบบุ๊กมาร์กของเบราว์เซอร์ทั้งหมดของฉันโดยชี้ไปที่svn.python.org/view/python/trunk ;-)
Alex Martelli

ฉันอยากรู้ว่ามันทำหน้าที่list_ass_item()อะไร :)
Chris Lutz

2
ดำเนินการมอบหมายให้กับรายการของรายการ (เช่นเดียวกับ list_ass_slice ดำเนินการมอบหมายให้กับส่วนของรายการ) โดยไม่เกี่ยวข้องกับการเรียงลำดับ ฉันเดาว่าคำย่อของ "การมอบหมาย" ทำให้ชื่อตลก ...
Alex Martelli

3
เวอร์ชันปัจจุบันของlistsort.txtเพิ่มบันทึกย่อบางส่วนที่กล่าวถึงความสับสนทั่วไป
Tim Peters

31

ฉันแค่ต้องการส่งลิงค์ที่เป็นประโยชน์ที่ฉันพลาดไปในคำตอบที่ครอบคลุมเป็นอย่างอื่นของ Alex: คำอธิบายระดับสูงเกี่ยวกับ timsort ของ Python (พร้อมการแสดงภาพกราฟ!)

(ใช่ตอนนี้อัลกอริทึมรู้จักกันในชื่อTimsort )


9

ในเวอร์ชัน python ก่อนหน้านี้ฟังก์ชันการจัดเรียงจะใช้ Quicksort เวอร์ชันที่แก้ไขแล้ว อย่างไรก็ตามถือว่าไม่เสถียรและเมื่อ 2.3 พวกเขาเปลี่ยนไปใช้อัลกอริธึมการผสานแบบปรับได้


1
Quicksort ไม่ใช่ 'ถือว่าไม่เสถียร' - ตามคำจำกัดความที่ใช้กันทั่วไป Quicksort ไม่เสถียรนั่นคือลำดับดั้งเดิมของสองวัตถุจะไม่ถูกเก็บรักษาไว้หากมีค่าเท่ากันในระหว่างการเรียงลำดับนี้ การมีอัลกอริธึมการเรียงลำดับที่ไม่เสถียรหมายความว่าคุณต้องใช้ 'เวทมนตร์' ทุกประเภทเพื่อจัดเรียงข้อมูลอย่างสมเหตุสมผลด้วยเกณฑ์ที่หลากหลายแทนที่จะเป็นเพียงแค่ความสามารถในการเรียงลำดับการโทรแบบเรียงลำดับตามลำดับเวลาหากคุณต้องการจัดเรียงตาม DOB แล้วตั้งชื่อ คุณเพียงแค่เรียงลำดับตามชื่อก่อนจากนั้น DOB คุณไม่สามารถทำได้ด้วย Quicksort
Tony Suffolk 66
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.