Python/sorts/adaptive_merge_sort.py

93 lines
2.6 KiB
Python
Raw Normal View History

2024-10-16 20:07:38 +00:00
def adaptive_merge_sort(sequence: list) -> list:
2024-10-11 18:36:23 +00:00
"""
Sorts a list using the Adaptive Merge Sort algorithm.
2024-10-16 19:27:11 +00:00
>>> adaptive_merge_sort([4, 3, 1, 2])
Initial sequence: [4, 3, 1, 2]
Sorting: array[0:2] and array[2:4]
Sorting: array[0:1] and array[1:2]
2024-10-16 19:48:06 +00:00
Merging: array[0:1] and array[1:2]
After merge: [3, 4]
2024-10-16 19:27:11 +00:00
Sorting: array[2:3] and array[3:4]
Skipping merge as array[2] <= array[3]
Merging: array[0:2] and array[2:4]
After merge: [1, 2, 3, 4]
Sorted sequence: [1, 2, 3, 4]
[1, 2, 3, 4]
2024-10-11 18:36:23 +00:00
"""
if len(sequence) < 2:
return sequence
2024-10-11 18:36:23 +00:00
aux = sequence[:]
print(f"Initial sequence: {sequence}")
adaptive_merge_sort_helper(sequence, aux, 0, len(sequence) - 1)
print(f"Sorted sequence: {sequence}")
return sequence
2024-10-16 19:27:11 +00:00
def adaptive_merge_sort_helper(array: list, aux: list, low: int, high: int) -> None:
"""
Helper function for Adaptive Merge Sort algorithm.
2024-10-16 19:27:11 +00:00
>>> adaptive_merge_sort_helper([4, 3, 1, 2], [4, 3, 1, 2], 0, 3)
Sorting: array[0:2] and array[2:4]
Sorting: array[0:1] and array[1:2]
2024-10-16 19:48:06 +00:00
Merging: array[0:1] and array[1:2]
After merge: [3, 4]
2024-10-16 19:27:11 +00:00
Sorting: array[2:3] and array[3:4]
Skipping merge as array[2] <= array[3]
Merging: array[0:2] and array[2:4]
After merge: [1, 2, 3, 4]
"""
2024-10-11 18:36:23 +00:00
if high <= low:
return
2024-10-11 18:36:23 +00:00
mid = (low + high) // 2
print(f"Sorting: array[{low}:{mid + 1}] and array[{mid + 1}:{high + 1}]")
2024-10-11 18:36:23 +00:00
adaptive_merge_sort_helper(aux, array, low, mid)
adaptive_merge_sort_helper(aux, array, mid + 1, high)
2024-10-11 18:36:23 +00:00
if array[mid] <= array[mid + 1]:
print(f"Skipping merge as array[{mid}] <= array[{mid + 1}]")
array[low : high + 1] = aux[low : high + 1]
2024-10-11 18:36:23 +00:00
return
2024-10-11 18:36:23 +00:00
merge(array, aux, low, mid, high)
2024-10-16 19:27:11 +00:00
def merge(array: list, aux: list, low: int, mid: int, high: int) -> None:
"""
Merges two sorted subarrays of the main array.
2024-10-11 18:36:23 +00:00
2024-10-16 19:27:11 +00:00
>>> merge([4, 3, 1, 2], [4, 3, 1, 2], 0, 1, 3)
Merging: array[0:2] and array[2:4]
After merge: [1, 2, 3, 4]
"""
2024-10-11 18:36:23 +00:00
print(f"Merging: array[{low}:{mid + 1}] and array[{mid + 1}:{high + 1}]")
2024-10-11 18:36:23 +00:00
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
2024-10-16 20:04:31 +00:00
elif array[i] <= array[j]: # Keep stable by using <=
2024-10-11 18:36:23 +00:00
aux[k] = array[i]
i += 1
2024-10-16 20:04:31 +00:00
else:
aux[k] = array[j]
j += 1
2024-10-16 19:55:53 +00:00
for k in range(low, high + 1):
array[k] = aux[k]
2024-10-16 20:04:31 +00:00
print(f"After merge: {array[low:high + 1]}")
# Example usage
if __name__ == "__main__":
print(adaptive_merge_sort([4, 3, 1, 2]))