Giới thiệu về phương thức sort () được xây dựng trong Python


104

sort()Phương thức tích hợp sẵn trong Python sử dụng thuật toán nào? Có thể xem mã của phương pháp đó không?


10
Tất nhiên có thể xem mã của phương pháp - Python là một dự án mã nguồn mở. Tuy nhiên, phương thức này có thể được triển khai trong C, vì vậy bạn sẽ phải biết một chút về C để hiểu nó.
Chris Lutz

Phiên bản có quan trọng không?
meder omuraliev

@melder: Không =) Tôi chỉ muốn xem một thuật toán chuyên nghiệp: P @chris: thế nào?
Johannes

3
Tải mã nguồn xuống trình thông dịch Python. Tôi không biết họ triển khai sort()phương pháp ở đâu hoặc định dạng cho trình thông dịch là gì, nhưng nó phải ở đó ở đâu đó và tôi cá rằng nó được triển khai bằng C vì những lo ngại về tốc độ.
Chris Lutz

Đây là một ví dụ về nó đang được sử dụng
Hari Ganesan

Câu trả lời:


118

Chắc chắn rồi! Mã ở đây , bắt đầu với chức năng isltvà tiếp tục cho QUITE một lúc ;-). Như nhận xét của Chris cho thấy, đó là mã C. Bạn cũng sẽ muốn đọc tệp văn bản này để biết giải thích bằng văn bản, kết quả, v.v.

Nếu bạn thích đọc mã Java hơn mã C, bạn có thể xem việc triển khai timsort trong và cho Java của Joshua Bloch (Joshua cũng là người đã triển khai, vào năm 1997, hợp nhất được sửa đổi vẫn được sử dụng trong Java và người ta có thể hy vọng rằng Java sẽ cuối cùng chuyển sang cổng timsort gần đây của anh ấy).

Một số giải thích về cổng Java của timsort là ở đây , sự khác biệt là ở đây (với con trỏ đến tất cả các tệp cần thiết), tệp chính ở đây - FWIW, trong khi tôi là một lập trình viên C giỏi hơn lập trình Java, trong trường hợp này, tôi thấy Nhìn chung, mã Java của Joshua dễ đọc hơn mã C của Tim ;-).


4
@Chris, "Duyệt qua các nguồn Python" là một lối tắt trong tất cả các thanh dấu trang của trình duyệt của tôi - nó trỏ đến svn.python.org/view/python/trunk ;-).
Alex Martelli

Tôi muốn biết những gì chức năng list_ass_item()làm. :)
Chris Lutz

2
Thực hiện gán cho một mục của danh sách (giống như list_ass_slice thực hiện gán cho một phần của danh sách), không liên quan gì đến việc sắp xếp. Tôi đoán chữ viết tắt của "chuyển nhượng" làm tên buồn cười ...
Alex Martelli

3
Phiên bản hiện tại của listsort.txtbổ sung một số ghi chú giải quyết những nhầm lẫn phổ biến.
Tim Peters


9

Trong các phiên bản python đầu tiên, hàm sắp xếp đã triển khai một phiên bản sửa đổi của quicksort. Tuy nhiên, nó được coi là không ổn định và kể từ ngày 2.3, họ chuyển sang sử dụng thuật toán hợp nhất thích ứng.


quicksort không được 'coi là không ổn định' - theo định nghĩa thường được sử dụng, quicksort là không ổn định - đó là thứ tự ban đầu của hai đối tượng không được bảo toàn, nếu chúng bằng nhau trong quá trình sắp xếp này. Có một thuật toán sắp xếp không ổn định có nghĩa là bạn phải nghĩ ra tất cả các loại 'ma thuật' để sắp xếp dữ liệu một cách hợp lý với nhiều tiêu chí, thay vì chỉ có thể sắp xếp chuỗi các lệnh gọi - trong timsort nếu bạn muốn sắp xếp theo DOB ​​và sau đó đặt tên , bạn chỉ cần sắp xếp theo tên trước, và sau đó DOB Bạn không thể làm điều đó với quicksort
Tony Suffolk 66
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.