Đâ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-kth
tì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,R
sao cho tất cả các phần tử trong R
lớn hơn pivot
và L
tấ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 A
có 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.