1
- def adaptive_merge_sort (sequence : list ) -> list :
1
+ def adaptive_merge_sort (sequence : list ) -> list :
2
2
"""
3
3
Sorts a list using the Adaptive Merge Sort algorithm.
4
4
@@ -17,6 +17,7 @@ def adaptive_merge_sort(sequence: list) -> list:
17
17
"""
18
18
if len (sequence ) < 2 :
19
19
return sequence
20
+
20
21
aux = sequence [:]
21
22
print (f"Initial sequence: { sequence } " )
22
23
adaptive_merge_sort_helper (sequence , aux , 0 , len (sequence ) - 1 )
@@ -40,14 +41,18 @@ def adaptive_merge_sort_helper(array: list, aux: list, low: int, high: int) -> N
40
41
"""
41
42
if high <= low :
42
43
return
44
+
43
45
mid = (low + high ) // 2
44
46
print (f"Sorting: array[{ low } :{ mid + 1 } ] and array[{ mid + 1 } :{ high + 1 } ]" )
47
+
45
48
adaptive_merge_sort_helper (aux , array , low , mid )
46
49
adaptive_merge_sort_helper (aux , array , mid + 1 , high )
50
+
47
51
if array [mid ] <= array [mid + 1 ]:
48
52
print (f"Skipping merge as array[{ mid } ] <= array[{ mid + 1 } ]" )
49
- array [low : high + 1 ] = aux [low : high + 1 ]
53
+ array [low : high + 1 ] = aux [low : high + 1 ]
50
54
return
55
+
51
56
merge (array , aux , low , mid , high )
52
57
53
58
@@ -60,6 +65,7 @@ def merge(array: list, aux: list, low: int, mid: int, high: int) -> None:
60
65
After merge: [1, 2, 3, 4]
61
66
"""
62
67
print (f"Merging: array[{ low } :{ mid + 1 } ] and array[{ mid + 1 } :{ high + 1 } ]" )
68
+
63
69
i , j = low , mid + 1
64
70
for k in range (low , high + 1 ):
65
71
if i > mid :
@@ -68,13 +74,19 @@ def merge(array: list, aux: list, low: int, mid: int, high: int) -> None:
68
74
elif j > high :
69
75
aux [k ] = array [i ]
70
76
i += 1
71
- elif array [j ] < array [i ]:
72
- aux [k ] = array [j ]
73
- j += 1
74
- else :
77
+ elif array [i ] <= array [j ]: # Keep stable by using <=
75
78
aux [k ] = array [i ]
76
79
i += 1
77
- # Ensure we correctly copy back to the main array
80
+ else :
81
+ aux [k ] = array [j ]
82
+ j += 1
83
+
78
84
for k in range (low , high + 1 ):
79
85
array [k ] = aux [k ]
80
- print (f"After merge: { aux [low :high + 1 ]} " )
86
+
87
+ print (f"After merge: { array [low :high + 1 ]} " )
88
+
89
+
90
+ # Example usage
91
+ if __name__ == "__main__" :
92
+ print (adaptive_merge_sort ([4 , 3 , 1 , 2 ]))
0 commit comments