41 lines
1.4 KiB
Python
Raw Normal View History

2026-01-29 06:54:10 +01:00
"""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)