From f6bcd000f1005a48fd9e3262059a08745a0d6166 Mon Sep 17 00:00:00 2001 From: Harsh Raj Singhania <40535627+HarshRajSinghania@users.noreply.github.com> Date: Thu, 10 Sep 2026 00:09:40 +0530 Subject: [PATCH] sorts: type double sort for comparable items --- sorts/double_sort.py | 98 ++++++++++++++++++++++++-------------------- tests/test_sorts.py | 1 + 2 files changed, 55 insertions(+), 44 deletions(-) diff --git a/sorts/double_sort.py b/sorts/double_sort.py index bd5fdca1e63c..20bf2ff9ddd5 100644 --- a/sorts/double_sort.py +++ b/sorts/double_sort.py @@ -1,44 +1,54 @@ -from typing import Any - - -def double_sort(collection: list[Any]) -> list[Any]: - """This sorting algorithm sorts an array using the principle of bubble sort, - but does it both from left to right and right to left. - Hence, it's called "Double sort" - :param collection: mutable ordered sequence of elements - :return: the same collection in ascending order - Examples: - >>> double_sort([-1 ,-2 ,-3 ,-4 ,-5 ,-6 ,-7]) - [-7, -6, -5, -4, -3, -2, -1] - >>> double_sort([]) - [] - >>> double_sort([-1 ,-2 ,-3 ,-4 ,-5 ,-6]) - [-6, -5, -4, -3, -2, -1] - >>> double_sort([-3, 10, 16, -42, 29]) == sorted([-3, 10, 16, -42, 29]) - True - """ - no_of_elements = len(collection) - for _ in range( - int(((no_of_elements - 1) / 2) + 1) - ): # we don't need to traverse to end of list as - for j in range(no_of_elements - 1): - # apply the bubble sort algorithm from left to right (or forwards) - if collection[j + 1] < collection[j]: - collection[j], collection[j + 1] = collection[j + 1], collection[j] - # apply the bubble sort algorithm from right to left (or backwards) - if collection[no_of_elements - 1 - j] < collection[no_of_elements - 2 - j]: - ( - collection[no_of_elements - 1 - j], - collection[no_of_elements - 2 - j], - ) = ( - collection[no_of_elements - 2 - j], - collection[no_of_elements - 1 - j], - ) - return collection - - -if __name__ == "__main__": - # allow the user to input the elements of the list on one line - unsorted = [int(x) for x in input("Enter the list to be sorted: ").split() if x] - print("the sorted list is") - print(f"{double_sort(unsorted) = }") + +from typing import Protocol + + +class Comparable(Protocol): + def __lt__(self, other: object, /) -> bool: ... + + +def double_sort[T: Comparable](collection: list[T]) -> list[T]: + """This sorting algorithm sorts an array using the principle of bubble sort, + but does it both from left to right and right to left. + Hence, it's called "Double sort" + :param collection: mutable ordered sequence of elements + :return: the same collection in ascending order + Examples: + >>> double_sort([-1 ,-2 ,-3 ,-4 ,-5 ,-6 ,-7]) + [-7, -6, -5, -4, -3, -2, -1] + >>> double_sort([]) + [] + >>> double_sort([-1 ,-2 ,-3 ,-4 ,-5 ,-6]) + [-6, -5, -4, -3, -2, -1] + >>> double_sort([-3, 10, 16, -42, 29]) == sorted([-3, 10, 16, -42, 29]) + True + + >>> double_sort(["d", "a", "c", "b"]) + ['a', 'b', 'c', 'd'] + >>> double_sort([2.5, -1.0, 0.0]) + [-1.0, 0.0, 2.5] +""" + no_of_elements = len(collection) + for _ in range( + int(((no_of_elements - 1) / 2) + 1) + ): # we don't need to traverse to end of list as + for j in range(no_of_elements - 1): + # apply the bubble sort algorithm from left to right (or forwards) + if collection[j + 1] < collection[j]: + collection[j], collection[j + 1] = collection[j + 1], collection[j] + # apply the bubble sort algorithm from right to left (or backwards) + if collection[no_of_elements - 1 - j] < collection[no_of_elements - 2 - j]: + ( + collection[no_of_elements - 1 - j], + collection[no_of_elements - 2 - j], + ) = ( + collection[no_of_elements - 2 - j], + collection[no_of_elements - 1 - j], + ) + return collection + + +if __name__ == "__main__": + # allow the user to input the elements of the list on one line + unsorted = [int(x) for x in input("Enter the list to be sorted: ").split() if x] + print("the sorted list is") + print(f"{double_sort(unsorted) = }") diff --git a/tests/test_sorts.py b/tests/test_sorts.py index caa4b31cac81..8394a96aef80 100644 --- a/tests/test_sorts.py +++ b/tests/test_sorts.py @@ -96,6 +96,7 @@ def test_sort_matches_builtin(sort, case): bubble_sort_iterative, bubble_sort_recursive, insertion_sort, + double_sort, ], ids=lambda f: f.__name__, )