From 49791f326a67288118ceb782e61f321d6146b9c6 Mon Sep 17 00:00:00 2001 From: Harsh Raj Singhania <40535627+HarshRajSinghania@users.noreply.github.com> Date: Wed, 16 Sep 2026 12:07:45 +0530 Subject: [PATCH] sorts: make reverse_selection_sort generic over Comparable items --- sorts/reverse_selection.py | 29 +++++++++++++++++++++++++---- tests/test_sorts.py | 3 +++ 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/sorts/reverse_selection.py b/sorts/reverse_selection.py index 5d11ec97bd52..cbb3e404124a 100644 --- a/sorts/reverse_selection.py +++ b/sorts/reverse_selection.py @@ -4,14 +4,23 @@ This algorithm progressively sorts the array by reversing subarrays For doctests run following command: -python3 -m doctest -v reverse_selection_sort.py +python3 -m doctest -v reverse_selection.py For manual testing run: -python3 reverse_selection_sort.py +python3 reverse_selection.py """ +from collections.abc import MutableSequence +from typing import Any, Protocol -def reverse_subarray(arr: list, start: int, end: int) -> None: + +class Comparable(Protocol): + def __lt__(self, other: Any, /) -> bool: ... + + +def reverse_subarray[T: Comparable]( + arr: MutableSequence[T], start: int, end: int +) -> None: """ Reverse a subarray in-place. @@ -41,7 +50,9 @@ def reverse_subarray(arr: list, start: int, end: int) -> None: end -= 1 -def reverse_selection_sort(collection: list) -> list: +def reverse_selection_sort[T: Comparable]( + collection: MutableSequence[T], +) -> MutableSequence[T]: """ A pure implementation of reverse selection sort algorithm in Python @@ -64,6 +75,16 @@ def reverse_selection_sort(collection: list) -> list: >>> reverse_selection_sort([5, 4, 3, 2, 1]) [1, 2, 3, 4, 5] + + >>> reverse_selection_sort(["c", "a", "b"]) + ['a', 'b', 'c'] + + >>> reverse_selection_sort([2.5, -1, 0.0]) + [-1, 0.0, 2.5] + + >>> reverse_selection_sort([1, "a"]) + Traceback (most recent call last): + TypeError: '<' not supported between instances of 'str' and 'int' """ n = len(collection) for i in range(n - 1): diff --git a/tests/test_sorts.py b/tests/test_sorts.py index 2c9b79aa4bfe..8271da726cef 100644 --- a/tests/test_sorts.py +++ b/tests/test_sorts.py @@ -35,6 +35,7 @@ from sorts.odd_even_sort import odd_even_sort from sorts.patience_sort import patience_sort from sorts.quick_sort import quick_sort +from sorts.reverse_selection import reverse_selection_sort from sorts.selection_sort import selection_sort from sorts.shell_sort import shell_sort from sorts.stooge_sort import stooge_sort @@ -66,6 +67,7 @@ def test_heap_sort() -> None: odd_even_sort, patience_sort, quick_sort, + reverse_selection_sort, selection_sort, shell_sort, stooge_sort, @@ -121,6 +123,7 @@ def test_sort_matches_builtin(sort, case) -> None: gnome_sort, insertion_sort, merge_sort, + reverse_selection_sort, selection_sort, ], ids=lambda f: f.__name__,