The Quickselect algorithm is a powerful tool to find the kth
smallest element in an unsorted array without fully sorting it. It works efficiently in most cases, running in O(n)
average time.
Understanding the Goal
If you were to sort the array, the kth
smallest element would be at index k - 1
. But full sorting takes O(n log n)
time. Quickselect helps us get the answer without sorting everything.
How It Works
The algorithm works by choosing a pivot (often randomly) and partitioning the array into three groups:
- Lows: all elements less than the pivot
- Pivots: all elements equal to the pivot
- Highs: all elements greater than the pivot
Now, depending on the size of these groups, we decide where to continue:
- If
k
is less than or equal to the size of lows
, then the answer lies in the lows
part, and we recursively apply Quickselect there.
- If
k
falls within the size of lows + pivots
, then the pivot is the kth
smallest number—we return it directly.
- Otherwise, we look into
highs
, subtracting the size of lows
and pivots
from k
because we’ve skipped over that many smaller elements.
Handling Special Cases
- If the array is empty or
k < 1
, return -1
because there's no valid answer.
- If
k
is larger than the number of elements in the array, we should also return -1
to indicate it's out of bounds.
- If the array contains duplicates, the algorithm still works since it accounts for equal-to-pivot elements as a separate group.
- If the array has only one element, and
k = 1
, that single element is the answer.
This approach avoids the overhead of full sorting and gives us just the answer we need by narrowing our focus each time.