It is interesting to note that there is a way to get rid of
the randomness here without losing the nice linear running time
bound. After all, the worst-case running time here is O(n2),
whereas we know we can do it in deterministically.
The resulting algorithm is not really practical, but it's clever.
Idea: Replace with choice of pivot element with something that guarantees we get a sufficiently good split.