From 451d4e14e290c596ee7c38f342fd7725fae3c459 Mon Sep 17 00:00:00 2001
From: ANANT JAIN <139585700+anant-jain01@users.noreply.github.com>
Date: Sat, 12 Oct 2024 00:06:23 +0530
Subject: [PATCH] Create adaptive_merge_sort.py

---
 sorts/adaptive_merge_sort.py | 51 ++++++++++++++++++++++++++++++++++++
 1 file changed, 51 insertions(+)
 create mode 100644 sorts/adaptive_merge_sort.py

diff --git a/sorts/adaptive_merge_sort.py b/sorts/adaptive_merge_sort.py
new file mode 100644
index 000000000..a3a7f4dc2
--- /dev/null
+++ b/sorts/adaptive_merge_sort.py
@@ -0,0 +1,51 @@
+def adaptive_merge_sort(sequence: list) -> list:
+    """
+    Sorts a list using the Adaptive Merge Sort algorithm.
+    """
+    if len(sequence) < 2:
+        return sequence
+
+    aux = sequence[:]
+    print(f"Initial sequence: {sequence}")
+    adaptive_merge_sort_helper(sequence, aux, 0, len(sequence) - 1)
+    print(f"Sorted sequence: {sequence}")
+    return sequence
+
+
+def adaptive_merge_sort_helper(array: list, aux: list, low: int, high: int):
+    if high <= low:
+        return
+
+    mid = (low + high) // 2
+    print(f"Sorting: array[{low}:{mid + 1}] and array[{mid + 1}:{high + 1}]")
+
+    adaptive_merge_sort_helper(aux, array, low, mid)
+    adaptive_merge_sort_helper(aux, array, mid + 1, high)
+
+    if array[mid] <= array[mid + 1]:
+        print(f"Skipping merge as array[{mid}] <= array[{mid + 1}]")
+        array[low:high + 1] = aux[low:high + 1]
+        return
+
+    merge(array, aux, low, mid, high)
+
+
+def merge(array: list, aux: list, low: int, mid: int, high: int):
+    print(f"Merging: array[{low}:{mid + 1}] and array[{mid + 1}:{high + 1}]")
+    i, j = low, mid + 1
+
+    for k in range(low, high + 1):
+        if i > mid:
+            aux[k] = array[j]
+            j += 1
+        elif j > high:
+            aux[k] = array[i]
+            i += 1
+        elif array[j] < array[i]:
+            aux[k] = array[j]
+            j += 1
+        else:
+            aux[k] = array[i]
+            i += 1
+
+    print(f"After merge: {aux[low:high + 1]}")