This module implements various algorithms based on the introsort algorithm,
originally described by David R. Musser in the paper /Introspective Sorting
and Selection Algorithms/. It is also in widespread practical use, as the
standard unstable sort used in the C++ Standard Template Library.

Introsort is at its core a quicksort. The version implemented here has the
following optimizations that make it perform better in practice:

Small segments of the array are left unsorted until a final insertion
sort pass. This is faster than recursing all the way down to
one-element arrays.

The pivot for segment [l,u) is chosen as the median of the elements at
l, u-1 and (u+l)/2. This yields good behavior on mostly sorted (or
reverse-sorted) arrays.

The algorithm tracks its recursion depth, and if it decides it is
taking too long (depth greater than 2 * lg n), it switches to a heap
sort to maintain O(n lg n) worst case behavior. (This is what makes the
algorithm introsort).