Tôi đã xem bài nói chuyện Three Beautiful Quicksorts và đang rối tung xung quanh với quicksort. Việc thực hiện của tôi trong python rất giống với c (chọn trục xoay, phân vùng xung quanh nó và đệ quy trên phân vùng nhỏ hơn và lớn hơn). Mà tôi nghĩ không phải là pythonic.Quicksort Python - List comprehension vs Recursion (thói quen phân vùng)
Vì vậy, đây là triển khai sử dụng tính năng hiểu danh sách trong python.
def qsort(list):
if list == []:
return []
pivot = list[0]
l = qsort([x for x in list[1:] if x < pivot])
u = qsort([x for x in list[1:] if x >= pivot])
return l + [pivot] + u
Cho phép gọi đệ quy metho qsortR. bây giờ tôi nhận thấy rằng qsortR chạy chậm hơn nhiều so với qsort cho các danh sách lớn (r). Trên thực tế "độ sâu đệ quy tối đa vượt quá trong cmp" ngay cả đối với 1000 elems cho phương pháp đệ quy. Mà tôi đặt lại trong sys.setrecursionlimit.
Một số con số:
list-compr 1000 elems 0.491770029068
recursion 1000 elems 2.24620914459
list-compr 2000 elems 0.992327928543
recursion 2000 elems 7.72630095482
Tất cả mã là here.
Tôi có một vài câu hỏi:
- Tại sao danh sách hiểu nhanh hơn rất nhiều?
- Một số chứng ngộ về giới hạn đệ quy trong python. Lần đầu tiên tôi đặt nó là 100000 trong trường hợp nào tôi nên cẩn thận?
- (chính xác nghĩa là gì 'tối ưu hóa đệ quy đuôi', làm thế nào nó được thực hiện?)
- Cố gắng sắp xếp 1000000 yếu tố hogged bộ nhớ của máy tính xách tay của tôi (với phương pháp đệ quy). Tôi nên làm gì nếu tôi muốn sắp xếp quá nhiều yếu tố? Loại tối ưu hóa nào có thể?
hmmm. ý tưởng tốt. Hãy để tôi thử điều đó. – swair
bạn nói đúng. Nó đã nhanh hơn nhưng không nhanh như phương pháp đọc danh sách. số: 1,2 cho 1000 danh sách elems và 3,41 cho 2000 elems – swair