From 6e7308900df1da27f163d5be34df15932414fc05 Mon Sep 17 00:00:00 2001 From: Priyanshu Gupta Date: Wed, 2 Oct 2024 20:29:06 +0530 Subject: [PATCH 1/2] Updation DNFsorting algo to make hacktoberfest contribution --- sorts/dutch_national_flag_sort.py | 78 +++++++++++++++---------------- 1 file changed, 38 insertions(+), 40 deletions(-) diff --git a/sorts/dutch_national_flag_sort.py b/sorts/dutch_national_flag_sort.py index b4f1665cea00..71bfc240188e 100644 --- a/sorts/dutch_national_flag_sort.py +++ b/sorts/dutch_national_flag_sort.py @@ -1,40 +1,36 @@ """ A pure implementation of Dutch national flag (DNF) sort algorithm in Python. -Dutch National Flag algorithm is an algorithm originally designed by Edsger Dijkstra. -It is the most optimal sort for 3 unique values (eg. 0, 1, 2) in a sequence. DNF can -sort a sequence of n size with [0 <= a[i] <= 2] at guaranteed O(n) complexity in a -single pass. +Originally designed by Edsger Dijkstra, it optimally sorts a sequence of three unique values +(e.g., 0, 1, 2) with [0 <= a[i] <= 2] in O(n) complexity in a single pass. -The flag of the Netherlands consists of three colors: white, red, and blue. -The task is to randomly arrange balls of white, red, and blue in such a way that balls -of the same color are placed together. DNF sorts a sequence of 0, 1, and 2's in linear -time that does not consume any extra space. This algorithm can be implemented only on -a sequence that contains three unique elements. +The task is to randomly arrange balls of white, red, and blue so that balls of the same color +are grouped together. DNF sorts a sequence of 0, 1, and 2's in linear time without consuming +extra space. The algorithm works only on sequences with three unique elements. 1) Time complexity is O(n). 2) Space complexity is O(1). -More info on: https://en.wikipedia.org/wiki/Dutch_national_flag_problem +For more info: https://en.wikipedia.org/wiki/Dutch_national_flag_problem -For doctests run following command: +For doctests run: python3 -m doctest -v dutch_national_flag_sort.py For manual testing run: python dnf_sort.py """ -# Python program to sort a sequence containing only 0, 1 and 2 in a single pass. -red = 0 # The first color of the flag. -white = 1 # The second color of the flag. -blue = 2 # The third color of the flag. -colors = (red, white, blue) +# Python program to sort a sequence containing only 0, 1, and 2 in a single pass. +RED = 0 # The first color (red). +WHITE = 1 # The second color (white). +BLUE = 2 # The third color (blue). +ALLOWED_VALUES = (RED, WHITE, BLUE) def dutch_national_flag_sort(sequence: list) -> list: """ - A pure Python implementation of Dutch National Flag sort algorithm. - :param data: 3 unique integer values (e.g., 0, 1, 2) in an sequence - :return: The same collection in ascending order + A Python implementation of the Dutch National Flag sorting algorithm. + :param sequence: A list of integers containing only 0, 1, and 2 + :return: Sorted sequence with the values 0, 1, 2 in ascending order >>> dutch_national_flag_sort([]) [] @@ -47,52 +43,54 @@ def dutch_national_flag_sort(sequence: list) -> list: >>> dutch_national_flag_sort("abacab") Traceback (most recent call last): ... - ValueError: The elements inside the sequence must contains only (0, 1, 2) values - >>> dutch_national_flag_sort("Abacab") - Traceback (most recent call last): - ... - ValueError: The elements inside the sequence must contains only (0, 1, 2) values + ValueError: The elements inside the sequence must contain only (0, 1, 2) values >>> dutch_national_flag_sort([3, 2, 3, 1, 3, 0, 3]) Traceback (most recent call last): ... - ValueError: The elements inside the sequence must contains only (0, 1, 2) values + ValueError: The elements inside the sequence must contain only (0, 1, 2) values >>> dutch_national_flag_sort([-1, 2, -1, 1, -1, 0, -1]) Traceback (most recent call last): ... - ValueError: The elements inside the sequence must contains only (0, 1, 2) values + ValueError: The elements inside the sequence must contain only (0, 1, 2) values >>> dutch_national_flag_sort([1.1, 2, 1.1, 1, 1.1, 0, 1.1]) Traceback (most recent call last): ... - ValueError: The elements inside the sequence must contains only (0, 1, 2) values + ValueError: The elements inside the sequence must contain only (0, 1, 2) values """ if not sequence: return [] if len(sequence) == 1: - return list(sequence) - low = 0 - high = len(sequence) - 1 - mid = 0 + return sequence + + low, mid, high = 0, 0, len(sequence) - 1 + while mid <= high: - if sequence[mid] == colors[0]: + if sequence[mid] == RED: sequence[low], sequence[mid] = sequence[mid], sequence[low] low += 1 mid += 1 - elif sequence[mid] == colors[1]: + elif sequence[mid] == WHITE: mid += 1 - elif sequence[mid] == colors[2]: + elif sequence[mid] == BLUE: sequence[mid], sequence[high] = sequence[high], sequence[mid] high -= 1 else: - msg = f"The elements inside the sequence must contains only {colors} values" - raise ValueError(msg) + raise ValueError(f"The elements inside the sequence must contain only {ALLOWED_VALUES} values") + return sequence if __name__ == "__main__": import doctest - doctest.testmod() - user_input = input("Enter numbers separated by commas:\n").strip() - unsorted = [int(item.strip()) for item in user_input.split(",")] - print(f"{dutch_national_flag_sort(unsorted)}") + # User input for manual testing + user_input = input("Enter numbers separated by commas (0, 1, 2 only):\n").strip() + try: + unsorted = [int(item.strip()) for item in user_input.split(",")] + if all(x in ALLOWED_VALUES for x in unsorted): + print(f"Sorted sequence: {dutch_national_flag_sort(unsorted)}") + else: + print("Error: Input must only contain the values 0, 1, and 2.") + except ValueError: + print("Error: Invalid input. Please enter integers only.") From e61a8085ba28094603f1ea95350cdbbd20aef356 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 2 Oct 2024 15:01:27 +0000 Subject: [PATCH 2/2] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- sorts/dutch_national_flag_sort.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/sorts/dutch_national_flag_sort.py b/sorts/dutch_national_flag_sort.py index 71bfc240188e..c5a800dca93e 100644 --- a/sorts/dutch_national_flag_sort.py +++ b/sorts/dutch_national_flag_sort.py @@ -1,10 +1,10 @@ """ A pure implementation of Dutch national flag (DNF) sort algorithm in Python. -Originally designed by Edsger Dijkstra, it optimally sorts a sequence of three unique values +Originally designed by Edsger Dijkstra, it optimally sorts a sequence of three unique values (e.g., 0, 1, 2) with [0 <= a[i] <= 2] in O(n) complexity in a single pass. -The task is to randomly arrange balls of white, red, and blue so that balls of the same color -are grouped together. DNF sorts a sequence of 0, 1, and 2's in linear time without consuming +The task is to randomly arrange balls of white, red, and blue so that balls of the same color +are grouped together. DNF sorts a sequence of 0, 1, and 2's in linear time without consuming extra space. The algorithm works only on sequences with three unique elements. 1) Time complexity is O(n). @@ -20,9 +20,9 @@ """ # Python program to sort a sequence containing only 0, 1, and 2 in a single pass. -RED = 0 # The first color (red). +RED = 0 # The first color (red). WHITE = 1 # The second color (white). -BLUE = 2 # The third color (blue). +BLUE = 2 # The third color (blue). ALLOWED_VALUES = (RED, WHITE, BLUE) @@ -75,13 +75,16 @@ def dutch_national_flag_sort(sequence: list) -> list: sequence[mid], sequence[high] = sequence[high], sequence[mid] high -= 1 else: - raise ValueError(f"The elements inside the sequence must contain only {ALLOWED_VALUES} values") - + raise ValueError( + f"The elements inside the sequence must contain only {ALLOWED_VALUES} values" + ) + return sequence if __name__ == "__main__": import doctest + doctest.testmod() # User input for manual testing