Mergesort Python

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)

 

Scroll to Top