Thuật toán nào sắp xếp sử dụng?


24

Tôi cần thêm một số nguyên duy nhất vào danh sách đã được sắp xếp, sao cho nó đi đúng chỗ. Suy nghĩ đầu tiên của tôi là một cái gì đó như

(sort (cons newelt list) #'<)

Tuy nhiên, do listđã được sắp xếp, chỉ cần một lần chèn, điều đó có nghĩa là giải pháp này có thể không phù hợp khủng khiếp tùy thuộc vào thuật toán được sử dụng sort.

Vậy, thuật toán sortsử dụng là gì?

Tôi sẽ tốt hơn nếu làm điều gì đó như sau?

(let ((tail list))
  ;; The first element is never less-than
  (while (and tail (< newelt (cadr tail)))
    (setq tail (cdr tail)))
  (setcdr tail (cons newelt (cdr tail)))
  list)

1
Tôi sẽ sử dụng một heap nhị phân (ví dụ heap.el ), nếu đó là một hoạt động thường xuyên trong mã của tôi.
lunaryorn

Để cho Bđược ban đầu đã được sắp xếp listACdanh sách ban đầu rỗng. Chia làm Bhai phần B1, B2độ dài mmhoặc m+1, và mso sánh neweltvới phần tử đầu tiên của B2. Nếu neweltđược mở rộng Asang bên phải bằng B1và thay thế Bbằng B2, thì mở rộng Csang bên trái bằng B2và thay thế Bbằng B1. Sau O(log n)các bước như vậy, không có gì còn lại trong B. Sau đó Achứa những thứ ≤ newelt, và Cnhững thứ đó > newelt, và ghép nối tạo ra danh sách được sắp xếp mở rộng. Xin lỗi vì không e-lispthích ngôn ngữ lắm.
jfbu

Câu trả lời:


26

Nếu bạn có mã nguồn Emacs cài đặt, bạn có thể tìm ra mã nguồn cho sortvới M-x find-function.

Ở đó bạn có thể thấy rằng sortthực hiện một loại hợp nhất. Nó kiểm tra độ dài của danh sách, chia danh sách thành một nửa, sắp xếp các phần "phía trước" và "phía sau" một cách riêng biệt thông qua đệ quy, sau đó hợp nhất hai phần.

Về việc thực hiện của bạn sẽ nhanh hơn - đo lường nó! Nó hiệu quả hơn về mặt lý thuyết (O (n) so với O (n log n)), nhưng sortcó lợi thế là được viết bằng C, vì vậy kết quả có thể đi theo bất kỳ cách nào. (Tất nhiên, đừng quên biên dịch byte chức năng của bạn.)


@Malabarba Đối với hồ sơ, bạn đã kiểm tra nó trên thang độ dài nào?
T. Verron

8
Đã kiểm tra 1000 lần chèn một số ngẫu nhiên vào danh sách 1000 số ngẫu nhiên (tất cả được tạo trước). Phương pháp thủ công nhanh hơn 6 lần.
Malabarba
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.