API đảm bảo sắp xếp ổn định mà Quicksort không cung cấp. Tuy nhiên, khi sắp xếp các giá trị nguyên thủy theo thứ tự tự nhiên của chúng, bạn sẽ không nhận thấy sự khác biệt vì các giá trị nguyên thủy không có danh tính. Do đó, Quicksort có thể được sử dụng cho các mảng nguyên thủy và sẽ được sử dụng khi nó được coi là hiệu quả hơn¹.
Đối với các đối tượng, bạn có thể nhận thấy, khi các đối tượng có danh tính khác nhau được coi là bình đẳng theo cách equals
triển khai của chúng hoặc được cung cấp Comparator
thay đổi thứ tự của chúng. Do đó, Quicksort không phải là một lựa chọn. Vì vậy, một biến thể của MergeSort được sử dụng, các phiên bản Java hiện tại sử dụng TimSort . Điều này áp dụng cho cả hai Arrays.sort
và Collections.sort
, mặc dù với Java 8, List
bản thân nó có thể ghi đè các thuật toán sắp xếp.
¹ Lợi thế về hiệu quả của Quicksort là cần ít bộ nhớ hơn khi thực hiện tại chỗ. Nhưng nó có hiệu suất trong trường hợp xấu nhất đáng kể và không thể khai thác các lần chạy dữ liệu được sắp xếp trước trong một mảng, điều mà TimSort thực hiện.
Do đó, các thuật toán sắp xếp đã được làm lại từ phiên bản này sang phiên bản khác, trong khi vẫn ở trong lớp được đặt tên nhầm DualPivotQuicksort
. Ngoài ra, tài liệu không bắt kịp, điều này cho thấy rằng nói chung là một ý tưởng tồi khi đặt tên một thuật toán được sử dụng nội bộ trong một đặc tả, khi không cần thiết.
Tình hình hiện tại (bao gồm cả Java 8 đến Java 11) như sau:
- Nói chung, các phương pháp sắp xếp cho các mảng nguyên thủy sẽ chỉ sử dụng Quicksort trong một số trường hợp nhất định. Đối với các mảng lớn hơn, họ sẽ cố gắng xác định các lần chạy dữ liệu được sắp xếp trước, giống như TimSort , và sẽ hợp nhất chúng khi số lần chạy không vượt quá một ngưỡng nhất định. Nếu không, chúng sẽ quay trở lại Quicksort , nhưng với một triển khai sẽ trở lại Sắp xếp chèn cho các phạm vi nhỏ, điều này không chỉ ảnh hưởng đến các mảng nhỏ mà còn cả đệ quy của sắp xếp nhanh.
sort(char[],…)
và sort(short[],…)
thêm một trường hợp đặc biệt khác, để sử dụng Sắp xếp đếm cho các mảng có độ dài vượt quá ngưỡng nhất định
- Tương tự như vậy,
sort(byte[],…)
sẽ sử dụng Sắp xếp đếm , nhưng với ngưỡng nhỏ hơn nhiều, tạo ra sự tương phản lớn nhất với tài liệu, vì sort(byte[],…)
không bao giờ sử dụng Quicksort. Nó chỉ sử dụng sắp xếp Chèn cho các mảng nhỏ và sắp xếp đếm ngược lại.