Bu özel bir durumdur seçim algoritması bulabilirsiniz ile bir dizinin en küçük elemanı inci k dizinin boyutunun yarısıdır. En kötü durumda doğrusal olan bir uygulama var.kk
Genel seçim algoritması
İlk edelim bir algoritma bakın find-kth
bulur bir dizinin inci en küçük elemanı: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))
İşlev , içindeki tüm öğelerin diğerlerinden ve hepsinden büyük olacak şekilde split(A, pivot)
döndürür (eksi bir oluşumuL,R
R
pivot
L
pivot
). Sonra her şey yinelemeli olarak yapılır.
Bu , ortalama ancak O ( n, 2 ) , en kötü durumda.O ( n )O ( n2)
Daha iyi bir pivot, A
bu medyanlar dizisi üzerinde prosedürü çağırarak, 5 büyüklüğündeki alt dizilerin tüm medyanlarının medyanıdır.
find-kth(A, k)
B = [median(A[1], .., A[5]), median(A[6], .., A[10]), ..]
pivot = find-kth(B, |B|/2)
...
Bu , her durumda garanti eder . Bu açık değil. Bu powerpoint slaytları hem algoritmayı hem de karmaşıklığı açıklamada yardımcı olur.O ( n )
Rasgele bir pivot kullanarak çoğu zaman daha hızlı olduğunu unutmayın.