Đây là trường hợp đặc biệt của thuật toán lựa chọn có thể tìm phần tử nhỏ thứ của một mảng với k là một nửa kích thước của mảng. Có một thực hiện là tuyến tính trong trường hợp xấu nhất.kk
Thuật toán lựa chọn chung
Trước tiên, hãy xem một thuật toán find-kthtìm phần tử nhỏ thứ của một mảng:k
find-kth(A, k)
pivot = random element of A
(L, R) = split(A, pivot)
if k = |L|+1, return pivot
if k ≤ |L| , return find-kth(L, k)
if k > |L|+1, return find-kth(R, k-(|L|+1))
Hàm split(A, pivot)trả về L,Rsao cho tất cả các phần tử trong Rlớn hơn pivotvà Ltất cả các phần tử khác (trừ một lần xuất hiện pivot). Sau đó tất cả được thực hiện đệ quy.
O(n)O(n2)
Một trục tốt hơn là trung vị của tất cả các trung vị của các mảng con Acó kích thước 5, bằng cách sử dụng thủ tục trên mảng của các trung vị này.
find-kth(A, k)
B = [median(A[1], .., A[5]), median(A[6], .., A[10]), ..]
pivot = find-kth(B, |B|/2)
...
O(n)
Lưu ý rằng hầu hết thời gian sử dụng trục ngẫu nhiên là nhanh hơn.