A sort composed of breaking down an array into minimal sets (2, if remainder then 3), then sorting and popping the smallest number when joining.

Implementation

from random import randint
data = [randint(1, 100) for x in range(10)]
 
# utility functions
def swap(from_pos: int, to_pos: int, arr: list[int]) -> None:
	arr[from_pos], arr[to_pos] = arr[to_pos], arr[from_pos]
 
# recursive implementation
def merge_sort(arr: list[int]):
	if len(arr) > 3:
		first_part = arr[:len(arr) // 2]
		first_part_empty = first_part == []
		merge_sort(first_part)
		
		second_part = arr[len(arr) // 2:]
		second_part_empty = second_part == []
		merge_sort(second_part)
		
		arr.clear()
		
		while not first_part_empty or not second_part_empty:
			if not first_part_empty and not second_part_empty:
				arr.append(first_part.pop(0) if first_part[0] < second_part[0] else second_part.pop(0))
			elif not first_part_empty:
				arr.append(first_part.pop(0))
			else:
				arr.append(second_part.pop(0))
			first_part_empty = first_part == []
			second_part_empty = second_part == []
	else:
		match len(arr):
			case 2:
				if arr[0] > arr[1]:
					swap(0, 1, arr)
			case 3:
				if arr[0] > arr[1]:
					swap(0, 1, arr)
				if arr[1] > arr[2]:
					swap(1, 2, arr)
				if arr[0] > arr[1]:
					swap(0, 1, arr)
 
merge_sort(data)
print(data)