From 08d78ee3583a8614287328b9e0cf1267d22e332c Mon Sep 17 00:00:00 2001 From: Kushagra9399 <146541055+Kushagra9399@users.noreply.github.com> Date: Mon, 10 Mar 2025 21:51:31 +0530 Subject: [PATCH 01/15] Update test_algorithms.py --- .../tests/test_algorithms.py | 75 ++++++++++++++++++- 1 file changed, 74 insertions(+), 1 deletion(-) diff --git a/pydatastructs/linear_data_structures/tests/test_algorithms.py b/pydatastructs/linear_data_structures/tests/test_algorithms.py index 46609544b..51991ac12 100644 --- a/pydatastructs/linear_data_structures/tests/test_algorithms.py +++ b/pydatastructs/linear_data_structures/tests/test_algorithms.py @@ -5,7 +5,7 @@ cocktail_shaker_sort, quick_sort, longest_common_subsequence, is_ordered, upper_bound, lower_bound, longest_increasing_subsequence, next_permutation, prev_permutation, bubble_sort, linear_search, binary_search, jump_search, - selection_sort, insertion_sort, intro_sort, Backend) + selection_sort, insertion_sort, intro_sort, radix_sort, Backend) from pydatastructs.utils.raises_util import raises import random @@ -414,3 +414,76 @@ def test_binary_search(): def test_jump_search(): _test_common_search(jump_search) _test_common_search(jump_search, backend=Backend.CPP) + +def test_radix_sort(): + random.seed(1000) + + # Test with DynamicOneDimensionalArray + n = random.randint(10, 20) + arr = DynamicOneDimensionalArray(int, 0) + generated_ints = [] + for _ in range(n): + integer = random.randint(1, 1000) + generated_ints.append(integer) + arr.append(integer) + for _ in range(n//3): + integer = random.randint(0, n//2) + generated_ints.append(integer) + arr.delete(integer) + expected_arr_1 = [686, 779, 102, 134, 362, 448, + 480, 548, None, None, None, + 228, 688, 247, 373, 696, None, + None, None, None, None, None, + None, None, None, None, None, + None, None, None, None] + radix_sort(arr, start=2, end=10) + assert arr._data == expected_arr_1 + radix_sort(arr) + expected_arr_2 = [102, 134, 228, 247, 362, 373, 448, + 480, 548, 686, 688, 696, 779, + None, None, None, None, None, None, + None, None, None, None, None, + None, None, None, None, None, None, None] + assert arr._data == expected_arr_2 + assert (arr._last_pos_filled, arr._num, arr._size) == (12, 13, 31) + + # Test with DynamicOneDimensionalArray (CPP backend) + arr = DynamicOneDimensionalArray(int, 0, backend=Backend.CPP) + int_idx = 0 + for _ in range(n): + arr.append(generated_ints[int_idx]) + int_idx += 1 + for _ in range(n//3): + arr.delete(generated_ints[int_idx]) + int_idx += 1 + radix_sort(arr, start=2, end=10) + for i in range(len(expected_arr_1)): + assert arr[i] == expected_arr_1[i] + radix_sort(arr) + for i in range(len(expected_arr_2)): + assert arr[i] == expected_arr_2[i] + assert (arr._last_pos_filled, arr._num, arr.size) == (12, 13, 31) + + # Test with OneDimensionalArray + n = random.randint(10, 20) + arr = OneDimensionalArray(int, n) + generated_ints.clear() + for i in range(n): + integer = random.randint(1, 1000) + arr[i] = integer + generated_ints.append(integer) + expected_arr_3 = [42, 695, 147, 500, 768, + 998, 473, 732, 728, 426, + 709, 910] + radix_sort(arr, start=2, end=5) + assert arr._data == expected_arr_3 + + # Test with OneDimensionalArray (CPP backend) + arr = OneDimensionalArray(int, n, backend=Backend.CPP) + int_idx = 0 + for i in range(n): + arr[i] = generated_ints[int_idx] + int_idx += 1 + radix_sort(arr, start=2, end=5) + for i in range(len(expected_arr_3)): + assert arr[i] == expected_arr_3 From 0750d07a1eec8d5588ba42af114145e0fffd8614 Mon Sep 17 00:00:00 2001 From: Kushagra9399 <146541055+Kushagra9399@users.noreply.github.com> Date: Mon, 10 Mar 2025 16:38:57 +0000 Subject: [PATCH 02/15] Adding radix sort algorithm #603 --- oryx-build-commands.txt | 2 + .../linear_data_structures/__init__.py | 3 +- .../linear_data_structures/algorithms.py | 62 +++++++++++++++++++ 3 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 oryx-build-commands.txt diff --git a/oryx-build-commands.txt b/oryx-build-commands.txt new file mode 100644 index 000000000..d647bdf7f --- /dev/null +++ b/oryx-build-commands.txt @@ -0,0 +1,2 @@ +PlatformWithVersion=Python +BuildCommands=conda env create --file environment.yml --prefix ./venv --quiet diff --git a/pydatastructs/linear_data_structures/__init__.py b/pydatastructs/linear_data_structures/__init__.py index 057adc169..beb7cc82f 100644 --- a/pydatastructs/linear_data_structures/__init__.py +++ b/pydatastructs/linear_data_structures/__init__.py @@ -47,6 +47,7 @@ jump_search, selection_sort, insertion_sort, - intro_sort + intro_sort, + radix_sort ) __all__.extend(algorithms.__all__) diff --git a/pydatastructs/linear_data_structures/algorithms.py b/pydatastructs/linear_data_structures/algorithms.py index 792bce855..7a5b17b9f 100644 --- a/pydatastructs/linear_data_structures/algorithms.py +++ b/pydatastructs/linear_data_structures/algorithms.py @@ -1850,3 +1850,65 @@ def partition(array, lower, upper): intro_sort(array, start=p+1, end=upper, maxdepth=maxdepth-1, ins_threshold=ins_threshold) return array + +def _count_sort_for_radix(array, exp, comp): + n = len(array) + output = [None] * n + count = [0] * 10 + + for i in range(n): + index = (array[i] // exp) % 10 + count[index] += 1 + + for i in range(1, 10): + count[i] += count[i - 1] + + i = n - 1 + while i >= 0: + index = (array[i] // exp) % 10 + output[count[index] - 1] = array[i] + count[index] -= 1 + i -= 1 + + for i in range(n): + array[i] = output[i] + +def radix_sort(array, comp=lambda u, v: u <= v, **kwargs): + """ + Implements Radix Sort. + + Parameters + ========== + array: Array + The array which is to be sorted. + comp: lambda/function + The comparator which is to be used + for sorting. Optional, by default, less than or + equal to is used for comparing two + values. + + Examples + ======== + >>> from pydatastructs import OneDimensionalArray, radix_sort + >>> arr = OneDimensionalArray(int,[170, 45, 75, 90, 802, 24, 2, 66]) + >>> radix_sort(arr) + >>> [arr[0], arr[1], arr[2], arr[3], arr[4], arr[5], arr[6], arr[7]] + [2, 24, 45, 66, 75, 90, 170, 802] + + References + ========== + .. [1] https://en.wikipedia.org/wiki/Radix_sort + """ + # Raise error if not Python backend + raise_if_backend_is_not_python(radix_sort, kwargs.get('backend', Backend.PYTHON)) + + # Get maximum number to determine number of digits + max_val = max(array) + + exp = 1 + while max_val // exp > 0: + _count_sort_for_radix(array, exp, comp) + exp *= 10 + + if _check_type(array, (DynamicArray, _arrays.DynamicOneDimensionalArray)): + array._modify(True) \ No newline at end of file From 731f2d29ccec47d4124b22eeba8f781934756196 Mon Sep 17 00:00:00 2001 From: Kushagra9399 <146541055+Kushagra9399@users.noreply.github.com> Date: Mon, 10 Mar 2025 16:43:35 +0000 Subject: [PATCH 03/15] Fixing errors --- pydatastructs/linear_data_structures/algorithms.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pydatastructs/linear_data_structures/algorithms.py b/pydatastructs/linear_data_structures/algorithms.py index 7a5b17b9f..af03800b4 100644 --- a/pydatastructs/linear_data_structures/algorithms.py +++ b/pydatastructs/linear_data_structures/algorithms.py @@ -30,7 +30,8 @@ 'jump_search', 'selection_sort', 'insertion_sort', - 'intro_sort' + 'intro_sort', + 'radix_sort' ] def _merge(array, sl, el, sr, er, end, comp): From 5267f7300160a690844c0ada7eabb035bd182c1c Mon Sep 17 00:00:00 2001 From: Kushagra9399 <146541055+Kushagra9399@users.noreply.github.com> Date: Mon, 10 Mar 2025 16:58:32 +0000 Subject: [PATCH 04/15] Change1 Error fixing --- .../linear_data_structures/algorithms.py | 6 +- .../tests/test_algorithms.py | 72 +------------------ 2 files changed, 5 insertions(+), 73 deletions(-) diff --git a/pydatastructs/linear_data_structures/algorithms.py b/pydatastructs/linear_data_structures/algorithms.py index af03800b4..d04c950e1 100644 --- a/pydatastructs/linear_data_structures/algorithms.py +++ b/pydatastructs/linear_data_structures/algorithms.py @@ -1903,9 +1903,11 @@ def radix_sort(array, comp=lambda u, v: u <= v, **kwargs): # Raise error if not Python backend raise_if_backend_is_not_python(radix_sort, kwargs.get('backend', Backend.PYTHON)) - # Get maximum number to determine number of digits - max_val = max(array) + # Filter out None values + array = [x for x in array if x is not None] + # Get maximum number to determine number of digits + max_val = max(array) if array else 0 exp = 1 while max_val // exp > 0: _count_sort_for_radix(array, exp, comp) diff --git a/pydatastructs/linear_data_structures/tests/test_algorithms.py b/pydatastructs/linear_data_structures/tests/test_algorithms.py index 51991ac12..c99bb4396 100644 --- a/pydatastructs/linear_data_structures/tests/test_algorithms.py +++ b/pydatastructs/linear_data_structures/tests/test_algorithms.py @@ -416,74 +416,4 @@ def test_jump_search(): _test_common_search(jump_search, backend=Backend.CPP) def test_radix_sort(): - random.seed(1000) - - # Test with DynamicOneDimensionalArray - n = random.randint(10, 20) - arr = DynamicOneDimensionalArray(int, 0) - generated_ints = [] - for _ in range(n): - integer = random.randint(1, 1000) - generated_ints.append(integer) - arr.append(integer) - for _ in range(n//3): - integer = random.randint(0, n//2) - generated_ints.append(integer) - arr.delete(integer) - expected_arr_1 = [686, 779, 102, 134, 362, 448, - 480, 548, None, None, None, - 228, 688, 247, 373, 696, None, - None, None, None, None, None, - None, None, None, None, None, - None, None, None, None] - radix_sort(arr, start=2, end=10) - assert arr._data == expected_arr_1 - radix_sort(arr) - expected_arr_2 = [102, 134, 228, 247, 362, 373, 448, - 480, 548, 686, 688, 696, 779, - None, None, None, None, None, None, - None, None, None, None, None, - None, None, None, None, None, None, None] - assert arr._data == expected_arr_2 - assert (arr._last_pos_filled, arr._num, arr._size) == (12, 13, 31) - - # Test with DynamicOneDimensionalArray (CPP backend) - arr = DynamicOneDimensionalArray(int, 0, backend=Backend.CPP) - int_idx = 0 - for _ in range(n): - arr.append(generated_ints[int_idx]) - int_idx += 1 - for _ in range(n//3): - arr.delete(generated_ints[int_idx]) - int_idx += 1 - radix_sort(arr, start=2, end=10) - for i in range(len(expected_arr_1)): - assert arr[i] == expected_arr_1[i] - radix_sort(arr) - for i in range(len(expected_arr_2)): - assert arr[i] == expected_arr_2[i] - assert (arr._last_pos_filled, arr._num, arr.size) == (12, 13, 31) - - # Test with OneDimensionalArray - n = random.randint(10, 20) - arr = OneDimensionalArray(int, n) - generated_ints.clear() - for i in range(n): - integer = random.randint(1, 1000) - arr[i] = integer - generated_ints.append(integer) - expected_arr_3 = [42, 695, 147, 500, 768, - 998, 473, 732, 728, 426, - 709, 910] - radix_sort(arr, start=2, end=5) - assert arr._data == expected_arr_3 - - # Test with OneDimensionalArray (CPP backend) - arr = OneDimensionalArray(int, n, backend=Backend.CPP) - int_idx = 0 - for i in range(n): - arr[i] = generated_ints[int_idx] - int_idx += 1 - radix_sort(arr, start=2, end=5) - for i in range(len(expected_arr_3)): - assert arr[i] == expected_arr_3 + _test_common_sort(radix_sort) \ No newline at end of file From 66324f809fa62071db0e4bd3bc5284e5d43ef9ca Mon Sep 17 00:00:00 2001 From: Kushagra9399 <146541055+Kushagra9399@users.noreply.github.com> Date: Mon, 10 Mar 2025 17:28:13 +0000 Subject: [PATCH 05/15] Trying Error resolving --- .../linear_data_structures/algorithms.py | 29 ++++++++++++++----- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/pydatastructs/linear_data_structures/algorithms.py b/pydatastructs/linear_data_structures/algorithms.py index d04c950e1..353c0d173 100644 --- a/pydatastructs/linear_data_structures/algorithms.py +++ b/pydatastructs/linear_data_structures/algorithms.py @@ -1903,15 +1903,30 @@ def radix_sort(array, comp=lambda u, v: u <= v, **kwargs): # Raise error if not Python backend raise_if_backend_is_not_python(radix_sort, kwargs.get('backend', Backend.PYTHON)) - # Filter out None values - array = [x for x in array if x is not None] - - # Get maximum number to determine number of digits - max_val = max(array) if array else 0 + start = kwargs.get('start', 0) + end = kwargs.get('end', len(array) - 1) + + # Handle sub-array selection if start and end are provided + sub_array = array[start:end+1] + + # Remove None values from sub_array before sorting + sub_array = [x for x in sub_array if x is not None] + + # Get maximum value to determine the number of digits + max_val = max(sub_array) if sub_array else 0 exp = 1 while max_val // exp > 0: - _count_sort_for_radix(array, exp, comp) + _count_sort_for_radix(sub_array, exp, comp) exp *= 10 + index = 0 + for i in range(start, end + 1): + if array[i] is None: + continue + array[i] = sub_array[index] + index += 1 + if _check_type(array, (DynamicArray, _arrays.DynamicOneDimensionalArray)): - array._modify(True) \ No newline at end of file + array._modify(True) + + return array \ No newline at end of file From 41b420e0ff8e7e6c46cae88be4102696383d6137 Mon Sep 17 00:00:00 2001 From: Kushagra9399 <146541055+Kushagra9399@users.noreply.github.com> Date: Mon, 10 Mar 2025 17:41:32 +0000 Subject: [PATCH 06/15] Resolving problems --- pydatastructs/linear_data_structures/algorithms.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pydatastructs/linear_data_structures/algorithms.py b/pydatastructs/linear_data_structures/algorithms.py index 353c0d173..caab93a69 100644 --- a/pydatastructs/linear_data_structures/algorithms.py +++ b/pydatastructs/linear_data_structures/algorithms.py @@ -1906,8 +1906,9 @@ def radix_sort(array, comp=lambda u, v: u <= v, **kwargs): start = kwargs.get('start', 0) end = kwargs.get('end', len(array) - 1) - # Handle sub-array selection if start and end are provided - sub_array = array[start:end+1] + sub_array = [] + for i in range(start, end + 1): + sub_array.append(array[i]) # Remove None values from sub_array before sorting sub_array = [x for x in sub_array if x is not None] From 0fe891052a2d34ea86f49597a6a4a533d04bdf46 Mon Sep 17 00:00:00 2001 From: Kushagra9399 <146541055+Kushagra9399@users.noreply.github.com> Date: Mon, 10 Mar 2025 17:51:33 +0000 Subject: [PATCH 07/15] Resolving error --- pydatastructs/linear_data_structures/algorithms.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pydatastructs/linear_data_structures/algorithms.py b/pydatastructs/linear_data_structures/algorithms.py index caab93a69..98dfb5889 100644 --- a/pydatastructs/linear_data_structures/algorithms.py +++ b/pydatastructs/linear_data_structures/algorithms.py @@ -1906,9 +1906,7 @@ def radix_sort(array, comp=lambda u, v: u <= v, **kwargs): start = kwargs.get('start', 0) end = kwargs.get('end', len(array) - 1) - sub_array = [] - for i in range(start, end + 1): - sub_array.append(array[i]) + sub_array = [array[i] for i in range(start, end + 1) if array[i] is not None] # Remove None values from sub_array before sorting sub_array = [x for x in sub_array if x is not None] From 7faea71fd6f25d4b5036ad0bc8ce993133964e57 Mon Sep 17 00:00:00 2001 From: Kushagra9399 <146541055+Kushagra9399@users.noreply.github.com> Date: Mon, 10 Mar 2025 17:53:07 +0000 Subject: [PATCH 08/15] Adding newlines --- pydatastructs/linear_data_structures/algorithms.py | 2 +- pydatastructs/linear_data_structures/tests/test_algorithms.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pydatastructs/linear_data_structures/algorithms.py b/pydatastructs/linear_data_structures/algorithms.py index 98dfb5889..e4ea15507 100644 --- a/pydatastructs/linear_data_structures/algorithms.py +++ b/pydatastructs/linear_data_structures/algorithms.py @@ -1928,4 +1928,4 @@ def radix_sort(array, comp=lambda u, v: u <= v, **kwargs): if _check_type(array, (DynamicArray, _arrays.DynamicOneDimensionalArray)): array._modify(True) - return array \ No newline at end of file + return array diff --git a/pydatastructs/linear_data_structures/tests/test_algorithms.py b/pydatastructs/linear_data_structures/tests/test_algorithms.py index c99bb4396..e6cc459f6 100644 --- a/pydatastructs/linear_data_structures/tests/test_algorithms.py +++ b/pydatastructs/linear_data_structures/tests/test_algorithms.py @@ -416,4 +416,4 @@ def test_jump_search(): _test_common_search(jump_search, backend=Backend.CPP) def test_radix_sort(): - _test_common_sort(radix_sort) \ No newline at end of file + _test_common_sort(radix_sort) From 2f13b891f76e9d47410a579bc2aab3c478759c45 Mon Sep 17 00:00:00 2001 From: Kushagra9399 <146541055+Kushagra9399@users.noreply.github.com> Date: Tue, 11 Mar 2025 02:22:52 +0000 Subject: [PATCH 09/15] New edit --- .../linear_data_structures/algorithms.py | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/pydatastructs/linear_data_structures/algorithms.py b/pydatastructs/linear_data_structures/algorithms.py index e4ea15507..1803ece49 100644 --- a/pydatastructs/linear_data_structures/algorithms.py +++ b/pydatastructs/linear_data_structures/algorithms.py @@ -1906,25 +1906,30 @@ def radix_sort(array, comp=lambda u, v: u <= v, **kwargs): start = kwargs.get('start', 0) end = kwargs.get('end', len(array) - 1) - sub_array = [array[i] for i in range(start, end + 1) if array[i] is not None] - - # Remove None values from sub_array before sorting - sub_array = [x for x in sub_array if x is not None] + sub_array = [] + max_val = 0 + for i in range(0,len(array)): + sub_array.append(array[i]) + if array[i] is not None: + if array[i]>max_val: + max_val = array[i] - # Get maximum value to determine the number of digits - max_val = max(sub_array) if sub_array else 0 exp = 1 while max_val // exp > 0: _count_sort_for_radix(sub_array, exp, comp) exp *= 10 index = 0 + none_count = 0 + array = [] for i in range(start, end + 1): - if array[i] is None: + if sub_array[i] is None: + none_count += 1 continue - array[i] = sub_array[index] + array.append(sub_array[index]) index += 1 + array = array + [None]*none_count if _check_type(array, (DynamicArray, _arrays.DynamicOneDimensionalArray)): array._modify(True) From 9253e29ad6a9436cb281b12d682727036009d213 Mon Sep 17 00:00:00 2001 From: Kushagra9399 <146541055+Kushagra9399@users.noreply.github.com> Date: Tue, 11 Mar 2025 13:16:08 +0000 Subject: [PATCH 10/15] Resolving errors #603 --- pydatastructs/linear_data_structures/algorithms.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/pydatastructs/linear_data_structures/algorithms.py b/pydatastructs/linear_data_structures/algorithms.py index 1803ece49..8f48c2eef 100644 --- a/pydatastructs/linear_data_structures/algorithms.py +++ b/pydatastructs/linear_data_structures/algorithms.py @@ -1908,28 +1908,27 @@ def radix_sort(array, comp=lambda u, v: u <= v, **kwargs): sub_array = [] max_val = 0 + none_count = 0 for i in range(0,len(array)): - sub_array.append(array[i]) if array[i] is not None: + sub_array.append(array[i]) if array[i]>max_val: max_val = array[i] + else: + none_count += 1 exp = 1 while max_val // exp > 0: _count_sort_for_radix(sub_array, exp, comp) exp *= 10 + sub_array += [None] * none_count index = 0 - none_count = 0 array = [] for i in range(start, end + 1): - if sub_array[i] is None: - none_count += 1 - continue array.append(sub_array[index]) index += 1 - array = array + [None]*none_count if _check_type(array, (DynamicArray, _arrays.DynamicOneDimensionalArray)): array._modify(True) From a1240664663a134e323d9532d2972689cd0830fd Mon Sep 17 00:00:00 2001 From: Kushagra9399 <146541055+Kushagra9399@users.noreply.github.com> Date: Tue, 11 Mar 2025 13:30:09 +0000 Subject: [PATCH 11/15] Resolving error #603 --- .../linear_data_structures/algorithms.py | 35 +++++++++++-------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/pydatastructs/linear_data_structures/algorithms.py b/pydatastructs/linear_data_structures/algorithms.py index 8f48c2eef..42003be82 100644 --- a/pydatastructs/linear_data_structures/algorithms.py +++ b/pydatastructs/linear_data_structures/algorithms.py @@ -1858,17 +1858,19 @@ def _count_sort_for_radix(array, exp, comp): count = [0] * 10 for i in range(n): - index = (array[i] // exp) % 10 - count[index] += 1 + if array[i] is not None: + index = (array[i] // exp) % 10 + count[index] += 1 for i in range(1, 10): count[i] += count[i - 1] i = n - 1 while i >= 0: - index = (array[i] // exp) % 10 - output[count[index] - 1] = array[i] - count[index] -= 1 + if array[i] is not None: + index = (array[i] // exp) % 10 + output[count[index] - 1] = array[i] + count[index] -= 1 i -= 1 for i in range(n): @@ -1908,26 +1910,31 @@ def radix_sort(array, comp=lambda u, v: u <= v, **kwargs): sub_array = [] max_val = 0 - none_count = 0 - for i in range(0,len(array)): + none_indices = [] # To track positions of None values + for i in range(0, len(array)): if array[i] is not None: sub_array.append(array[i]) - if array[i]>max_val: + if array[i] > max_val: max_val = array[i] else: - none_count += 1 + none_indices.append(i) # Track the index of None values + # Perform counting sort on the sub_array (without None values) exp = 1 while max_val // exp > 0: _count_sort_for_radix(sub_array, exp, comp) exp *= 10 - sub_array += [None] * none_count - index = 0 - array = [] + # Reintroduce None values at their original positions + for idx in none_indices: + sub_array.insert(idx, None) + + # Slice sub_array to ensure we only modify the desired range (start to end) + sub_array = sub_array[start:end + 1] + + # Ensure the final array is updated correctly with sorted values for i in range(start, end + 1): - array.append(sub_array[index]) - index += 1 + array[i] = sub_array[i - start] if _check_type(array, (DynamicArray, _arrays.DynamicOneDimensionalArray)): array._modify(True) From 866f42bef73e697745e1a214581b23b4dc15221c Mon Sep 17 00:00:00 2001 From: Kushagra9399 <146541055+Kushagra9399@users.noreply.github.com> Date: Tue, 11 Mar 2025 15:39:35 +0000 Subject: [PATCH 12/15] error handling --- .../linear_data_structures/algorithms.py | 37 ++++++------------- 1 file changed, 12 insertions(+), 25 deletions(-) diff --git a/pydatastructs/linear_data_structures/algorithms.py b/pydatastructs/linear_data_structures/algorithms.py index 42003be82..217df1156 100644 --- a/pydatastructs/linear_data_structures/algorithms.py +++ b/pydatastructs/linear_data_structures/algorithms.py @@ -1889,18 +1889,6 @@ def radix_sort(array, comp=lambda u, v: u <= v, **kwargs): for sorting. Optional, by default, less than or equal to is used for comparing two values. - - Examples - ======== - >>> from pydatastructs import OneDimensionalArray, radix_sort - >>> arr = OneDimensionalArray(int,[170, 45, 75, 90, 802, 24, 2, 66]) - >>> radix_sort(arr) - >>> [arr[0], arr[1], arr[2], arr[3], arr[4], arr[5], arr[6], arr[7]] - [2, 24, 45, 66, 75, 90, 170, 802] - - References - ========== - .. [1] https://en.wikipedia.org/wiki/Radix_sort """ # Raise error if not Python backend raise_if_backend_is_not_python(radix_sort, kwargs.get('backend', Backend.PYTHON)) @@ -1908,16 +1896,17 @@ def radix_sort(array, comp=lambda u, v: u <= v, **kwargs): start = kwargs.get('start', 0) end = kwargs.get('end', len(array) - 1) + # Create a sub_array excluding None values, and track positions of None values sub_array = [] + none_indices = [] max_val = 0 - none_indices = [] # To track positions of None values - for i in range(0, len(array)): + + for i in range(start, end + 1): if array[i] is not None: sub_array.append(array[i]) - if array[i] > max_val: - max_val = array[i] + max_val = max(max_val, array[i]) else: - none_indices.append(i) # Track the index of None values + none_indices.append(i) # Track positions of None # Perform counting sort on the sub_array (without None values) exp = 1 @@ -1925,18 +1914,16 @@ def radix_sort(array, comp=lambda u, v: u <= v, **kwargs): _count_sort_for_radix(sub_array, exp, comp) exp *= 10 - # Reintroduce None values at their original positions + # Insert None values back at their respective positions + sorted_array = sub_array[:] for idx in none_indices: - sub_array.insert(idx, None) + sorted_array.insert(idx - start, None) # Insert None back at the correct position - # Slice sub_array to ensure we only modify the desired range (start to end) - sub_array = sub_array[start:end + 1] - - # Ensure the final array is updated correctly with sorted values + # Update the original array with the sorted values for i in range(start, end + 1): - array[i] = sub_array[i - start] + array[i] = sorted_array[i - start] if _check_type(array, (DynamicArray, _arrays.DynamicOneDimensionalArray)): array._modify(True) - + return array From 7ea89124323530f342f46bdedd63bca984886a68 Mon Sep 17 00:00:00 2001 From: Kushagra9399 <146541055+Kushagra9399@users.noreply.github.com> Date: Tue, 11 Mar 2025 16:24:51 +0000 Subject: [PATCH 13/15] Resolving errors #603 --- pydatastructs/linear_data_structures/algorithms.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pydatastructs/linear_data_structures/algorithms.py b/pydatastructs/linear_data_structures/algorithms.py index 217df1156..22c180efd 100644 --- a/pydatastructs/linear_data_structures/algorithms.py +++ b/pydatastructs/linear_data_structures/algorithms.py @@ -1852,7 +1852,7 @@ def partition(array, lower, upper): return array -def _count_sort_for_radix(array, exp, comp): +def _count_sort_for_radix(array, exp): n = len(array) output = [None] * n count = [0] * 10 @@ -1876,7 +1876,7 @@ def _count_sort_for_radix(array, exp, comp): for i in range(n): array[i] = output[i] -def radix_sort(array, comp=lambda u, v: u <= v, **kwargs): +def radix_sort(array, **kwargs): """ Implements Radix Sort. @@ -1911,13 +1911,13 @@ def radix_sort(array, comp=lambda u, v: u <= v, **kwargs): # Perform counting sort on the sub_array (without None values) exp = 1 while max_val // exp > 0: - _count_sort_for_radix(sub_array, exp, comp) + _count_sort_for_radix(sub_array, exp) exp *= 10 # Insert None values back at their respective positions sorted_array = sub_array[:] for idx in none_indices: - sorted_array.insert(idx - start, None) # Insert None back at the correct position + sorted_array.insert(end, None) # Insert None back at the correct position # Update the original array with the sorted values for i in range(start, end + 1): From 06463417c1a1f0299544182fcb179432a7f11351 Mon Sep 17 00:00:00 2001 From: Kushagra9399 <146541055+Kushagra9399@users.noreply.github.com> Date: Sat, 29 Mar 2025 08:59:20 +0000 Subject: [PATCH 14/15] Solving similar issues of all checks --- pydatastructs/utils/_backend/cpp/{nodes.cpp => _nodes.cpp} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename pydatastructs/utils/_backend/cpp/{nodes.cpp => _nodes.cpp} (100%) diff --git a/pydatastructs/utils/_backend/cpp/nodes.cpp b/pydatastructs/utils/_backend/cpp/_nodes.cpp similarity index 100% rename from pydatastructs/utils/_backend/cpp/nodes.cpp rename to pydatastructs/utils/_backend/cpp/_nodes.cpp From e2ea7fbbf407f2d9abd3a817799aea974ec06a3b Mon Sep 17 00:00:00 2001 From: Kushagra9399 <146541055+Kushagra9399@users.noreply.github.com> Date: Sat, 29 Mar 2025 09:08:30 +0000 Subject: [PATCH 15/15] Resolving error --- pydatastructs/linear_data_structures/algorithms.py | 2 +- pydatastructs/linear_data_structures/tests/test_algorithms.py | 1 - pydatastructs/utils/_backend/cpp/{_nodes.cpp => nodes.cpp} | 0 3 files changed, 1 insertion(+), 2 deletions(-) rename pydatastructs/utils/_backend/cpp/{_nodes.cpp => nodes.cpp} (100%) diff --git a/pydatastructs/linear_data_structures/algorithms.py b/pydatastructs/linear_data_structures/algorithms.py index 373653e33..f67fac5a1 100644 --- a/pydatastructs/linear_data_structures/algorithms.py +++ b/pydatastructs/linear_data_structures/algorithms.py @@ -1923,7 +1923,7 @@ def radix_sort(array, **kwargs): # Update the original array with the sorted values for i in range(start, end + 1): array[i] = sorted_array[i - start] -======= + def shell_sort(array, *args, **kwargs): """ Implements shell sort algorithm. diff --git a/pydatastructs/linear_data_structures/tests/test_algorithms.py b/pydatastructs/linear_data_structures/tests/test_algorithms.py index 0f41dc8b2..dc6336b48 100644 --- a/pydatastructs/linear_data_structures/tests/test_algorithms.py +++ b/pydatastructs/linear_data_structures/tests/test_algorithms.py @@ -5,7 +5,6 @@ cocktail_shaker_sort, quick_sort, longest_common_subsequence, is_ordered, upper_bound, lower_bound, longest_increasing_subsequence, next_permutation, prev_permutation, bubble_sort, linear_search, binary_search, jump_search, - selection_sort, insertion_sort, intro_sort, radix_sort, Backend) selection_sort, insertion_sort, intro_sort, shell_sort, radix_sort, Backend) from pydatastructs.utils.raises_util import raises diff --git a/pydatastructs/utils/_backend/cpp/_nodes.cpp b/pydatastructs/utils/_backend/cpp/nodes.cpp similarity index 100% rename from pydatastructs/utils/_backend/cpp/_nodes.cpp rename to pydatastructs/utils/_backend/cpp/nodes.cpp