I've heard that in quicksort it is better to call recursion on the smaller subarray first. For example if 5
was the pivot and the data gets sorted to 4,1,3,5,7,6
then it's better to sort the subarray 7,6
first because it contains two elements where as 4,1,3
contains three.
The source of all knowledge gives the pseudocode for quicksort
quicksort(A, i, k):
if i < k:
p := partition(A, i, k)
quicksort(A, i, p - 1)
quicksort(A, p + 1, k)
So an algorithm that would implement away to recurse on the smaller array first would look something like
quicksort(A, i, k):
if i < k:
p := partition(A, i, k)
if(p-i > k-p)
/*difference from start point to pivot is greater than
difference from pivot to end point*/
quicksort(A, p + 1, k)
quicksort(A, i, p - 1)
else
quicksort(A, i, p - 1)
quicksort(A, p + 1, k)
I profiled code like this written in Java and it does appear to be faster but why? At first I thought it had to do with tail recursion optimization but then realized that was definilty wrong as Java doesn't support it.
Why is sorting the code in the smaller subarray first faster? This article claims it should be
Insertion sort is faster for small n because Quick Sort has extra overhead from the recursive function calls. Insertion sort is also more stable than Quick sort and requires less memory.
Quicksort algorithm is efficient if the size of the input is very large. But, insertion sort is more efficient than quick sort in case of small arrays as the number of comparisons and swaps are less compared to quicksort. So we combine the two algorithms to sort efficiently using both approaches.
Maybe I'm missing something subtle here, but if you recurse on your two cases in a different order then you're just traversing the recursion tree depth-first after potentially performing some swaps of children sub-trees at each node but it's still isomorphic to the original recursion tree and the set of all recursion depths for base cases will still be the same. The only way I can see getting demonstrable recursion depth reduction or other kind of recursion-related speed-up is doing something like you recurse on the smaller subarray and then pick a pivot for the larger subarray (without recursing) and then recurse on the two subcases for the larger subarray. This will turn your recursion tree into a ternary recursion tree instead of binary, that should typically have lower maximum depth.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With