Recursive quicksort in Python
When you've split a list into a smaller and a bigger halves, after sorting them  the elements in the first half are all still  smaller than all the elements in the second. 

So, merging such sorted halves is just positional concatenation, i.e. putting the two halves beside each other so that in the resulting sequence, first go the elements of the first half (sorted), and then the second. 

There's no need to compare the elements values in your merge, results of such comparisons are known in advance, predetermined by the  partition stage.

This is the essence of quicksort - partition by value, necessarily putting some effort into doing that, and then, after sorting the halves, join positionally, easily and simply.

The merge sort works the other way - it partitions the list simply, by position; and spends more effort merging the sorted parts, according to the elements' values: 

                 mergesort             quicksort

partition        positional            by value

merge            by value              positional


Splitting into three parts is a good optimization, but changes nothing regarding the above.