import math
def insertion_sort(arr, left, right):
for i in range(left + 1, right + 1):
key = arr[i]
j = i - 1
while j >= left and arr[j] > key:
arr[j + 1] = arr[j]
j -= 1
arr[j + 1] = key
def heapify(arr, n, i):
largest = i
left = 2 * i + 1
right = 2 * i + 2
if left < n and arr[left] > arr[largest]:
largest = left
if right < n and arr[right] > arr[largest]:
largest = right
if largest != i:
arr[i], arr[largest] = arr[largest], arr[i]
heapify(arr, n, largest)
def heapsort(arr):
n = len(arr)
for i in range(n // 2 - 1, -1, -1):
heapify(arr, n, i)
for i in range(n - 1, 0, -1):
arr[i], arr[0] = arr[0], arr[i]
heapify(arr, i, 0)
def quicksort(arr, left, right, depth_limit):
if left < right:
if right - left < 16:
insertion_sort(arr, left, right)
elif depth_limit == 0:
heapsort(arr[left:right+1])
else:
pivot = partition(arr, left, right)
quicksort(arr, left, pivot - 1, depth_limit - 1)
quicksort(arr, pivot + 1, right, depth_limit - 1)
def partition(arr, left, right):
pivot = arr[right]
i = left - 1
for j in range(left, right):
if arr[j] <= pivot:
i += 1
arr[i], arr[j] = arr[j], arr[i]
arr[i + 1], arr[right] = arr[right], arr[i + 1]
return i + 1
def introsort(arr):
depth_limit = int(math.log2(len(arr)) * 2)
quicksort(arr, 0, len(arr) - 1, depth_limit)
return arr
import random
numbers = [random.randint(1, 1000) for _ in range(500)]
sorted_numbers = introsort(numbers)
print("Sorted array:", sorted_numbers)