The QuickSort algorithm is a divide-and-conquer sorting technique that uses the partition function to reorder an array such that all elements less than or equal to the pivot are on its left. The quicksort function recursively sorts the left and right subarrays generated by partitioning the input array until the base case is reached, where the subarray contains only one element or is empty.
def quicksort(nums, start=0, end=None):
    """Quicksort using last element as pivot."""
    def partition(nums, start, end):
        pindex = start
        pivot = end
        for i in range(start, end):
            if nums[i] <= nums[pivot]:
                nums[i], nums[pindex] = nums[pindex], nums[i]
                pindex += 1
        nums[pindex], nums[pivot] = nums[pivot], nums[pindex]
        return pindex
    if not end:
        end = len(nums)-1
    if start >= end:
        return None
    pivot = partition(nums, start, end)
    quicksort(nums, start, pivot-1)
    quicksort(nums, pivot+1, end)
    
a = [2, 9, 2, 3, 5, 8, 1]
quicksort(a)
assert a == [1, 2, 2, 3, 5, 8, 9]
print('All passed!')
def quicksort(nums: list, start: int = 0, end: int = None) -> None:
    """
    Sorts the input list in-place using the Quicksort algorithm.
    Args:
        nums (list): The list to be sorted.
        start (int, optional): The starting index of the sublist to be sorted. Defaults to 0.
        end (int, optional): The ending index of the sublist to be sorted. Defaults to the last index of the list.
    Returns:
        None
    """
    if end is None:
        end = len(nums) - 1
    
    if start >= end:
        return
    partition_index = partition(nums, start, end)
    quicksort(nums, start, partition_index - 1)
    quicksort(nums, partition_index + 1, end)
def partition(nums: list, start: int, end: int) -> int:
    """
    Partitions the sublist around the pivot element.
    Args:
        nums (list): The list to be partitioned.
        start (int): The starting index of the sublist.
        end (int): The ending index of the sublist.
    Returns:
        int: The index of the pivot element after partitioning.
    """
    pivot = nums[end]
    i = start - 1
    for j in range(start, end):
        if nums[j] <= pivot:
            i += 1
            nums[i], nums[j] = nums[j], nums[i]
    nums[i + 1], nums[end] = nums[end], nums[i + 1]
    return i + 1
# Test the implementation
a = [2, 9, 2, 3, 5, 8, 1]
quicksort(a)
assert a == [1, 2, 2, 3, 5, 8, 9]
print('All passed!')The provided code implements the QuickSort algorithm, a popular sorting technique that uses a divide-and-conquer approach to sort an array of elements.
quicksort(nums, start=0, end=None)nums using the QuickSort algorithm.start and end specify the range of elements to sort. If not provided, the function sorts the entire array.None if the input array is empty or contains only one element.partition(nums, start, end)nums to have all elements less than or equal to the pivot element at the end of the range.partition function is used to choose a pivot element and reorder the input array such that all elements less than or equal to the pivot are on its left.quicksort function recursively sorts the left and right subarrays generated by partitioning the input array.None.a = [2, 9, 2, 3, 5, 8, 1]
quicksort(a)
assert a == [1, 2, 2, 3, 5, 8, 9]
This example sorts the input array a using the QuickSort algorithm and verifies that the sorted array matches the expected result.