From 24714510b18d5c127d4da6d729d40703be71c87a Mon Sep 17 00:00:00 2001 From: Ferbiya Peter <167544996+FerbiyaP@users.noreply.github.com> Date: Wed, 16 Sep 2026 18:40:24 +0530 Subject: [PATCH] Refactor adaptive_merge_sort for type safety with Protocol --- sorts/adaptive_merge_sort.py | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/sorts/adaptive_merge_sort.py b/sorts/adaptive_merge_sort.py index 157532aab98d..45d6d07f4a01 100644 --- a/sorts/adaptive_merge_sort.py +++ b/sorts/adaptive_merge_sort.py @@ -1,4 +1,11 @@ -def adaptive_merge_sort(sequence: list) -> list: +from typing import Protocol + + +class Comparable(Protocol): + def __lt__(self, other: object, /) -> bool: ... + + +def adaptive_merge_sort[T: Comparable](sequence: list[T]) -> list[T]: if len(sequence) < 2: return sequence @@ -9,7 +16,9 @@ def adaptive_merge_sort(sequence: list) -> list: return sequence -def adaptive_merge_sort_helper(array: list, aux: list, low: int, high: int) -> None: +def adaptive_merge_sort_helper[T: Comparable]( + array: list[T], aux: list[T], low: int, high: int +) -> None: if high <= low: return @@ -19,7 +28,7 @@ def adaptive_merge_sort_helper(array: list, aux: list, low: int, high: int) -> N adaptive_merge_sort_helper(aux, array, low, mid) adaptive_merge_sort_helper(aux, array, mid + 1, high) - if array[mid] <= array[mid + 1]: + if not array[mid + 1] < array[mid]: print(f"Skipping merge as array[{mid}] <= array[{mid + 1}]") array[low : high + 1] = aux[low : high + 1] return @@ -27,7 +36,9 @@ def adaptive_merge_sort_helper(array: list, aux: list, low: int, high: int) -> N merge(array, aux, low, mid, high) -def merge(array: list, aux: list, low: int, mid: int, high: int) -> None: +def merge[T: Comparable]( + array: list[T], aux: list[T], low: int, mid: int, high: int +) -> None: print(f"Merging: array[{low}:{mid + 1}] and array[{mid + 1}:{high + 1}]") i, j = low, mid + 1 @@ -39,7 +50,7 @@ def merge(array: list, aux: list, low: int, mid: int, high: int) -> None: else: aux[k] = array[i] i += 1 - elif array[i] <= array[j]: + elif not array[j] < array[i]: aux[k] = array[i] i += 1 else: @@ -55,3 +66,6 @@ def merge(array: list, aux: list, low: int, mid: int, high: int) -> None: # Example usage if __name__ == "__main__": print(adaptive_merge_sort([4, 3, 1, 2])) +# Example usage +if __name__ == "__main__": + print(adaptive_merge_sort([4, 3, 1, 2]))