"""Robust Quicksort implementation with variations""" import random def quicksort(arr, low=0, high=None, pivot_strategy='last'): if high is None: high = len(arr) - 1 if low < high: # Choose pivot based on strategy if pivot_strategy == 'random': pivot_index = random.randint(low, high) arr[pivot_index], arr[high] = arr[high], arr[pivot_index] elif pivot_strategy == 'median-of-three': mid = (low + high) // 2 # Find median of arr[low], arr[mid], arr[high] s = sorted([(arr[low], low), (arr[mid], mid), (arr[high], high)], key=lambda x: x[0]) median_index = s[1][1] arr[median_index], arr[high] = arr[high], arr[median_index] # Partition p = partition(arr, low, high) # Recursively sort partitions quicksort(arr, low, p - 1, pivot_strategy) quicksort(arr, p + 1, high, pivot_strategy) def partition(arr, low, high): pivot = arr[high] i = low - 1 for j in range(low, high): if arr[j] <= pivot: i += 1 arr[i], arr[j] = arr[j], arr[i] arr[i + 1], arr[high] = arr[high], arr[i + 1] return i + 1 # Example usage if __name__ == "__main__": data = [3, 6, 8, 10, 1, 2, 1, 5, 9, 4] print("Original data:", data) quicksort(data, pivot_strategy='median-of-three') print("Sorted data:", data)