From 7bfc8fd0bbc1e435f5fd579692bd2ac354b96b1e Mon Sep 17 00:00:00 2001 From: modusensus Date: Sat, 19 Sep 2026 15:27:44 +0800 Subject: [PATCH] sorts: make merge_insertion_sort generic over Comparable items --- sorts/merge_insertion_sort.py | 14 ++++++++++---- tests/test_sorts.py | 3 +++ 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/sorts/merge_insertion_sort.py b/sorts/merge_insertion_sort.py index be71303a5a49..d17a341f2165 100644 --- a/sorts/merge_insertion_sort.py +++ b/sorts/merge_insertion_sort.py @@ -13,8 +13,14 @@ from __future__ import annotations +from typing import Any, Protocol -def binary_search_insertion(sorted_list, item): + +class Comparable(Protocol): + def __lt__(self, other: Any, /) -> bool: ... + + +def binary_search_insertion[T: Comparable](sorted_list: list[T], item: T) -> list[T]: """ >>> binary_search_insertion([1, 2, 7, 9, 10], 4) [1, 2, 4, 7, 9, 10] @@ -35,7 +41,7 @@ def binary_search_insertion(sorted_list, item): return sorted_list -def merge(left, right): +def merge[T: Comparable](left: list[list[T]], right: list[list[T]]) -> list[list[T]]: """ >>> merge([[1, 6], [9, 10]], [[2, 3], [4, 5], [7, 8]]) [[1, 6], [2, 3], [4, 5], [7, 8], [9, 10]] @@ -49,7 +55,7 @@ def merge(left, right): return result + left + right -def sortlist_2d(list_2d): +def sortlist_2d[T: Comparable](list_2d: list[list[T]]) -> list[list[T]]: """ >>> sortlist_2d([[9, 10], [1, 6], [7, 8], [2, 3], [4, 5]]) [[1, 6], [2, 3], [4, 5], [7, 8], [9, 10]] @@ -61,7 +67,7 @@ def sortlist_2d(list_2d): return merge(sortlist_2d(list_2d[:middle]), sortlist_2d(list_2d[middle:])) -def merge_insertion_sort(collection: list[int]) -> list[int]: +def merge_insertion_sort[T: Comparable](collection: list[T]) -> list[T]: """Pure implementation of merge-insertion sort algorithm in Python :param collection: some mutable ordered collection with heterogeneous diff --git a/tests/test_sorts.py b/tests/test_sorts.py index d18be1c22b83..8e55d9e90fc7 100644 --- a/tests/test_sorts.py +++ b/tests/test_sorts.py @@ -35,6 +35,7 @@ from sorts.heap_sort import heap_sort from sorts.insertion_sort import insertion_sort from sorts.iterative_merge_sort import iter_merge_sort +from sorts.merge_insertion_sort import merge_insertion_sort from sorts.merge_sort import merge_sort from sorts.odd_even_sort import odd_even_sort from sorts.odd_even_transposition_single_threaded import odd_even_transposition @@ -73,6 +74,7 @@ def test_heap_sort() -> None: insertion_sort, iter_merge_sort, merge, + merge_insertion_sort, merge_sort, odd_even_sort, odd_even_transposition, @@ -145,6 +147,7 @@ def test_rec_insertion_sort(case) -> None: gnome_sort, insertion_sort, merge, + merge_insertion_sort, merge_sort, odd_even_sort, odd_even_transposition,