overview
Chooses a pivot, partitions the array based on pivot values, and recursively sorts subarrays
time complexity
AverageCase: O(n log n),
WorstCase: O(n^2) - can be improved with optimal pivot selection
Space complexity
O(log n) due to its recursive nature