Điều này có ý nghĩa với tôi rằng điều này giúp giải quyết vấn đề nhanh hơn nếu hai nửa mất ít hơn một nửa công việc xử lý toàn bộ tập dữ liệu.
Đó không phải là bản chất của thuật toán phân chia và chinh phục. Thông thường, vấn đề là các thuật toán không thể "đối phó với toàn bộ tập dữ liệu". Thay vào đó, nó được chia thành các phần nhỏ để giải quyết (như sắp xếp hai số), sau đó chúng được giải một cách tầm thường và kết quả được kết hợp lại theo cách mang lại giải pháp cho tập dữ liệu đầy đủ.
Nhưng tại sao không chia bộ dữ liệu thành ba phần? Bốn? n?
Chủ yếu là vì tách nó thành nhiều hơn hai phần và kết hợp lại nhiều hơn hai kết quả dẫn đến việc thực hiện phức tạp hơn nhưng không thay đổi đặc tính cơ bản (Big O) của thuật toán - sự khác biệt là một yếu tố không đổi và có thể dẫn đến chậm lại nếu sự phân chia và kết hợp lại của hơn 2 tập con sẽ tạo thêm chi phí.
Ví dụ: nếu bạn thực hiện sắp xếp hợp nhất 3 chiều, thì trong giai đoạn kết hợp lại, bây giờ bạn phải tìm 3 phần tử lớn nhất cho mỗi phần tử, yêu cầu 2 so sánh thay vì 1, vì vậy bạn sẽ thực hiện gấp đôi tổng số so sánh . Đổi lại, bạn giảm độ sâu đệ quy theo hệ số ln (2) / ln (3) == 0,63, do đó bạn có số lần hoán đổi ít hơn 37%, nhưng so sánh nhiều hơn 2 * 0,63 == 26% (và truy cập bộ nhớ). Cho dù đó là tốt hay xấu phụ thuộc vào cái nào đắt hơn trong phần cứng của bạn.
Tôi cũng đã thấy nhiều tài liệu tham khảo về quicksort 3 chiều. Khi nào thì nhanh hơn?
Rõ ràng, một biến thể trục kép của quicksort có thể được chứng minh là yêu cầu cùng số lượng so sánh nhưng trung bình ít hơn 20% giao dịch hoán đổi, vì vậy đó là một lợi ích ròng.
Những gì được sử dụng trong thực tế?
Ngày nay hầu như không ai lập trình các thuật toán sắp xếp của riêng họ nữa; họ sử dụng một cái được cung cấp bởi một thư viện. Ví dụ: API Java 7 thực sự sử dụng quicksort trục kép.
Những người thực sự lập trình thuật toán sắp xếp của riêng họ vì một số lý do sẽ có xu hướng dính vào biến thể 2 chiều đơn giản vì ít có khả năng xảy ra lỗi hơn hiệu suất tốt hơn 20% trong hầu hết thời gian. Hãy nhớ rằng: cho đến nay, cải tiến hiệu suất quan trọng nhất là khi mã chuyển từ "không hoạt động" sang "hoạt động".