1
- def adaptive_merge_sort (sequence : list ) -> list :
2
- """
3
- Sorts a list using the Adaptive Merge Sort algorithm.
4
-
5
- >>> adaptive_merge_sort([4, 3, 1, 2])
6
- Initial sequence: [4, 3, 1, 2]
7
- Sorting: array[0:2] and array[2:4]
8
- Sorting: array[0:1] and array[1:2]
9
- Merging: array[0:1] and array[1:2]
10
- After merge: [3, 4]
11
- Sorting: array[2:3] and array[3:4]
12
- Skipping merge as array[2] <= array[3]
13
- Merging: array[0:2] and array[2:4]
14
- After merge: [1, 2, 3, 4]
15
- Sorted sequence: [1, 2, 3, 4]
16
- [1, 2, 3, 4]
17
- """
18
- if len (sequence ) < 2 :
19
- return sequence
20
-
21
- aux = sequence [:]
22
- print (f"Initial sequence: { sequence } " )
23
- adaptive_merge_sort_helper (sequence , aux , 0 , len (sequence ) - 1 )
24
- print (f"Sorted sequence: { sequence } " )
25
- return sequence
26
-
27
-
28
- def adaptive_merge_sort_helper (array : list , aux : list , low : int , high : int ) -> None :
29
- """
30
- Helper function for Adaptive Merge Sort algorithm.
31
-
32
- >>> adaptive_merge_sort_helper([4, 3, 1, 2], [4, 3, 1, 2], 0, 3)
33
- Sorting: array[0:2] and array[2:4]
34
- Sorting: array[0:1] and array[1:2]
35
- Merging: array[0:1] and array[1:2]
36
- After merge: [3, 4]
37
- Sorting: array[2:3] and array[3:4]
38
- Skipping merge as array[2] <= array[3]
39
- Merging: array[0:2] and array[2:4]
40
- After merge: [1, 2, 3, 4]
41
- """
42
- if high <= low :
43
- return
44
-
45
- mid = (low + high ) // 2
46
- print (f"Sorting: array[{ low } :{ mid + 1 } ] and array[{ mid + 1 } :{ high + 1 } ]" )
47
-
48
- adaptive_merge_sort_helper (aux , array , low , mid )
49
- adaptive_merge_sort_helper (aux , array , mid + 1 , high )
50
-
51
- if array [mid ] <= array [mid + 1 ]:
52
- print (f"Skipping merge as array[{ mid } ] <= array[{ mid + 1 } ]" )
53
- array [low : high + 1 ] = aux [low : high + 1 ]
54
- return
55
-
56
- merge (array , aux , low , mid , high )
57
-
58
-
59
1
def merge (array : list , aux : list , low : int , mid : int , high : int ) -> None :
60
2
"""
61
3
Merges two sorted subarrays of the main array.
@@ -68,19 +10,20 @@ def merge(array: list, aux: list, low: int, mid: int, high: int) -> None:
68
10
69
11
i , j = low , mid + 1
70
12
for k in range (low , high + 1 ):
71
- if i > mid or ( j <= high and array [ j ] < array [ i ]) :
13
+ if i > mid :
72
14
aux [k ] = array [j ]
73
15
j += 1
74
- else :
16
+ elif j > high :
75
17
aux [k ] = array [i ]
76
18
i += 1
19
+ elif array [i ] <= array [j ]:
20
+ aux [k ] = array [i ]
21
+ i += 1
22
+ else :
23
+ aux [k ] = array [j ]
24
+ j += 1
77
25
78
26
for k in range (low , high + 1 ):
79
27
array [k ] = aux [k ]
80
28
81
29
print (f"After merge: { array [low :high + 1 ]} " )
82
-
83
-
84
- # Example usage
85
- if __name__ == "__main__" :
86
- print (adaptive_merge_sort ([4 , 3 , 1 , 2 ]))
0 commit comments