def merge_sort_elegant(A):
# 1. Initial State
print(f"{'-'*20} Initial State {'-'*20}")
print(f"{A}\n")
n = len(A)
if n <= 1:
return A
# First Split
mid = n // 2
B = A[:mid]
C = A[mid:]
# 2. Divided State (First Split)
print(f"{'-'*20} Divided State {'-'*20}")
print(f"Left Side (B): {B}")
print(f"Right Side (C): {C}\n")
# Internal sorting logic
def core_sort(arr):
if len(arr) <= 1: return arr
m = len(arr) // 2
return core_merge(core_sort(arr[:m]), core_sort(arr[m:]))
def core_merge(left, right):
res = []
i = j = 0
while i < len(left) and j < len(right):
if left[i] <= right[j]:
res.append(left[i]); i += 1
else:
res.append(right[j]); j += 1
res.extend(left[i:] if i < len(left) else right[j:])
return res
# 3. Merged State
final = core_merge(core_sort(B), core_sort(C))
print(f"{'-'*20} Merged State {'-'*20}")
print(f"{final}")
return final
# Test with n=13
data = [13, 7, 1, 3, 2, 5, 4, 6, 8, 10, 12, 11, 9]
merge_sort_elegant(data)