From 612f5188e37ef9d58dd461366c0f85dba4182971 Mon Sep 17 00:00:00 2001 From: nikhil-mewar <149755197+nikhil-mewar@users.noreply.github.com> Date: Mon, 21 Sep 2026 22:20:09 +0530 Subject: [PATCH] sorts: make strand sort work with comparable types (#15350) * sorts: make strand sort work with comparable types * Add type parameter to strand_sort function * Add strand_sort to sorting tests --------- Co-authored-by: nikhil.mewar@valiancesolutions.com Co-authored-by: Christian Clauss --- sorts/strand_sort.py | 18 +++++++++++++++++- tests/test_sorts.py | 1 + 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/sorts/strand_sort.py b/sorts/strand_sort.py index 4cadd3961..ee41aa5df 100644 --- a/sorts/strand_sort.py +++ b/sorts/strand_sort.py @@ -1,7 +1,19 @@ import operator +from typing import Protocol, TypeVar -def strand_sort(arr: list, reverse: bool = False, solution: list | None = None) -> list: +class Comparable(Protocol): + def __lt__(self, other: object, /) -> bool: ... + + def __gt__(self, other: object, /) -> bool: ... + + +T = TypeVar("T", bound=Comparable) + + +def strand_sort[T]( + arr: list[T], reverse: bool = False, solution: list[T] | None = None +) -> list[T]: """ Strand sort implementation source: https://en.wikipedia.org/wiki/Strand_sort @@ -16,6 +28,10 @@ def strand_sort(arr: list, reverse: bool = False, solution: list | None = None) >>> strand_sort([4, 2, 5, 3, 0, 1], reverse=True) [5, 4, 3, 2, 1, 0] + + >>> strand_sort(["banana", "apple", "cherry"]) + ['apple', 'banana', 'cherry'] + """ _operator = operator.lt if reverse else operator.gt solution = solution or [] diff --git a/tests/test_sorts.py b/tests/test_sorts.py index f2b14be44..e3e91838a 100644 --- a/tests/test_sorts.py +++ b/tests/test_sorts.py @@ -142,6 +142,7 @@ def test_rec_insertion_sort(case) -> None: pancake_sort, selection_sort, shrink_shell_sort, + strand_sort, ], ids=lambda f: f.__name__, )