IntroSort (Introspective Sort) is a hybrid sorting algorithm that combines the quickness of Quick Sort with the robustness of Heap Sort and Insertion Sort. It was invented by David Musser in 1997 and is designed to provide optimal performance for various types of input data by adapting to the data’s characteristics.
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[i] < arr[left]:
largest = left
if right < n and arr[largest] < arr[right]:
largest = right
if largest != i:
arr[i], arr[largest] = arr[largest], arr[i]
heapify(arr, n, largest)
def heap_sort(arr, left, right):
n = right - left + 1
for i in range(n // 2 - 1, -1, -1):
heapify(arr, n, i)
for i in range(n - 1, 0, -1):
arr[0], arr[i] = arr[i], arr[0]
heapify(arr, i, 0)
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
def introsort_util(arr, low, high, maxdepth):
if high - low <= 16:
insertion_sort(arr, low, high)
elif maxdepth == 0:
heap_sort(arr, low, high)
else:
pivot = partition(arr, low, high)
introsort_util(arr, low, pivot - 1, maxdepth - 1)
introsort_util(arr, pivot + 1, high, maxdepth - 1)
def introsort(arr):
maxdepth = int(math.log2(len(arr))) * 2
introsort_util(arr, 0, len(arr) - 1, maxdepth)
return arr
# Example usage
arr = [12, 11, 13, 5, 6, 7]
sorted_arr = introsort(arr)
print("Sorted array is:", sorted_arr)
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
left to right.def heapify(arr, n, i):
largest = i
left = 2 * i + 1
right = 2 * i + 2
if left < n and arr[i] < arr[left]:
largest = left
if right < n and arr[largest] < arr[right]:
largest = right
if largest != i:
arr[i], arr[largest] = arr[largest], arr[i]
heapify(arr, n, largest)
i satisfies the heap property.def heap_sort(arr, left, right):
n = right - left + 1
for i in range(n // 2 - 1, -1, -1):
heapify(arr, n, i)
for i in range(n - 1, 0, -1):
arr[0], arr[i] = arr[i], arr[0]
heapify(arr, i, 0)
left to right using heap sort.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
def introsort_util(arr, low, high, maxdepth):
if high - low <= 16:
insertion_sort(arr, low, high)
elif maxdepth == 0:
heap_sort(arr, low, high)
else:
pivot = partition(arr, low, high)
introsort_util(arr, low, pivot - 1, maxdepth - 1)
introsort_util(arr, pivot + 1, high, maxdepth - 1)
def introsort(arr):
maxdepth = int(math.log2(len(arr))) * 2
introsort_util(arr, 0, len(arr) - 1, maxdepth)
return arr
introsort_util function.arr = [12, 11, 13, 5, 6, 7]
sorted_arr = introsort(arr)
print("Sorted array is:", sorted_arr)
arr is sorted using the introsort function, and the sorted list is printed.Sorted array is: [5, 6, 7, 11, 12, 13]