Implement or outline the Quick sort algorithm and provide its pseudo-code or code.
Implement sort_array(nums), which accepts a list of integers, sorts it in ascending order in place, and returns the same list. Explain the partition strategy, base case, average and worst-case time complexity, and auxiliary space usage. The implementation should handle empty lists, duplicate values, negative values, and already sorted input.
def sort_array(nums):