From e2eec425298b5c26804c8de947939f871ec56417 Mon Sep 17 00:00:00 2001 From: Fayupable <90789180+Fayupable@users.noreply.github.com> Date: Thu, 24 Sep 2026 12:19:38 +0300 Subject: [PATCH] sorts: type unknown_sort's merge_sort for any comparable item Part of #15234. --- sorts/unknown_sort.py | 19 ++++++++++++++++++- tests/test_sorts.py | 3 +++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/sorts/unknown_sort.py b/sorts/unknown_sort.py index 3545da68ea80..9382f9f73b27 100644 --- a/sorts/unknown_sort.py +++ b/sorts/unknown_sort.py @@ -5,8 +5,14 @@ already O(n) """ +from typing import Protocol -def merge_sort(collection: list) -> list: + +class Comparable(Protocol): + def __lt__(self, other: object, /) -> bool: ... + + +def merge_sort[T: Comparable](collection: list[T]) -> list[T]: """Pure implementation of the fastest merge sort algorithm in Python :param collection: some mutable ordered collection with heterogeneous @@ -22,6 +28,17 @@ def merge_sort(collection: list) -> list: >>> merge_sort([-2, -5, -45]) [-45, -5, -2] + + >>> merge_sort(['d', 'a', 'b', 'e']) == sorted(['d', 'a', 'b', 'e']) + True + + >>> merge_sort([1.1, 3.3, 5.5, 2.2, 4.4]) + [1.1, 2.2, 3.3, 4.4, 5.5] + + >>> merge_sort([1, "a"]) # doctest: +IGNORE_EXCEPTION_DETAIL + Traceback (most recent call last): + ... + TypeError: '<' not supported between instances of 'str' and 'int' """ start, end = [], [] while len(collection) > 1: diff --git a/tests/test_sorts.py b/tests/test_sorts.py index d18be1c22b83..a639564fbab0 100644 --- a/tests/test_sorts.py +++ b/tests/test_sorts.py @@ -49,6 +49,7 @@ from sorts.shrink_shell_sort import shell_sort as shrink_shell_sort from sorts.stooge_sort import stooge_sort from sorts.strand_sort import strand_sort +from sorts.unknown_sort import merge_sort as unknown_sort def test_heap_sort() -> None: @@ -85,6 +86,7 @@ def test_heap_sort() -> None: shrink_shell_sort, stooge_sort, strand_sort, + unknown_sort, ) @@ -153,6 +155,7 @@ def test_rec_insertion_sort(case) -> None: selection_sort, shrink_shell_sort, strand_sort, + unknown_sort, ], ids=lambda f: f.__name__, )