From 548b0bf9b212ab7d3dffe14bfc4b5b5e81c56152 Mon Sep 17 00:00:00 2001 From: hesham-ashraf Date: Sat, 7 Dec 2024 22:42:28 +0200 Subject: [PATCH] Radix Sort implementation --- Programs/Radix/RadixSort.java | 80 +++++++++++++++++++++++++++++++ Programs/Radix/RadixSortTest.java | 59 +++++++++++++++++++++++ README.md | 2 + 3 files changed, 141 insertions(+) create mode 100644 Programs/Radix/RadixSort.java create mode 100644 Programs/Radix/RadixSortTest.java diff --git a/Programs/Radix/RadixSort.java b/Programs/Radix/RadixSort.java new file mode 100644 index 0000000..7c885fa --- /dev/null +++ b/Programs/Radix/RadixSort.java @@ -0,0 +1,80 @@ +// Radix sort Java implementation + +import java.io.*; +import java.util.*; + +class Radix { + + // A utility function to get maximum value in arr[] + static int getMax(int arr[], int n) + { + int mx = arr[0]; + for (int i = 1; i < n; i++) + if (arr[i] > mx) + mx = arr[i]; + return mx; + } + + // A function to do counting sort of arr[] according to + // the digit represented by exp. + static void countSort(int arr[], int n, int exp) + { + int output[] = new int[n]; // output array + int i; + int count[] = new int[10]; + Arrays.fill(count, 0); + + // Store count of occurrences in count[] + for (i = 0; i < n; i++) + count[(arr[i] / exp) % 10]++; + + // Change count[i] so that count[i] now contains + // actual position of this digit in output[] + for (i = 1; i < 10; i++) + count[i] += count[i - 1]; + + // Build the output array + for (i = n - 1; i >= 0; i--) { + output[count[(arr[i] / exp) % 10] - 1] = arr[i]; + count[(arr[i] / exp) % 10]--; + } + + // Copy the output array to arr[], so that arr[] now + // contains sorted numbers according to current + // digit + for (i = 0; i < n; i++) + arr[i] = output[i]; + } + + // The main function to that sorts arr[] of + // size n using Radix Sort + static void radixsort(int arr[], int n) + { + // Find the maximum number to know number of digits + int m = getMax(arr, n); + + // Do counting sort for every digit. Note that + // instead of passing digit number, exp is passed. + // exp is 10^i where i is current digit number + for (int exp = 1; m / exp > 0; exp *= 10) + countSort(arr, n, exp); + } + + // A utility function to print an array + static void print(int arr[], int n) + { + for (int i = 0; i < n; i++) + System.out.print(arr[i] + " "); + } + + // Main driver method + public static void main(String[] args) + { + int arr[] = { 170, 45, 75, 90, 802, 24, 2, 66 }; + int n = arr.length; + + // Function Call + radixsort(arr, n); + print(arr, n); + } +} \ No newline at end of file diff --git a/Programs/Radix/RadixSortTest.java b/Programs/Radix/RadixSortTest.java new file mode 100644 index 0000000..db6ea59 --- /dev/null +++ b/Programs/Radix/RadixSortTest.java @@ -0,0 +1,59 @@ +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; + +class RadixSortTest { + + @Test + void testRadixSortWithPositiveNumbers() { + int[] input = {170, 45, 75, 90, 802, 24, 2, 66}; + int[] expected = {2, 24, 45, 66, 75, 90, 170, 802}; + + Radix.radixsort(input, input.length); + assertArrayEquals(expected, input, "The sorted array does not match the expected output"); + } + + @Test + void testRadixSortWithAllEqualNumbers() { + int[] input = {5, 5, 5, 5, 5}; + int[] expected = {5, 5, 5, 5, 5}; + + Radix.radixsort(input, input.length); + assertArrayEquals(expected, input, "The sorted array does not match the expected output"); + } + + @Test + void testRadixSortWithSingleElement() { + int[] input = {42}; + int[] expected = {42}; + + Radix.radixsort(input, input.length); + assertArrayEquals(expected, input, "The sorted array does not match the expected output"); + } + + @Test + void testRadixSortWithAlreadySortedArray() { + int[] input = {1, 2, 3, 4, 5}; + int[] expected = {1, 2, 3, 4, 5}; + + Radix.radixsort(input, input.length); + assertArrayEquals(expected, input, "The sorted array does not match the expected output"); + } + + @Test + void testRadixSortWithDescendingArray() { + int[] input = {9, 8, 7, 6, 5, 4, 3, 2, 1}; + int[] expected = {1, 2, 3, 4, 5, 6, 7, 8, 9}; + + Radix.radixsort(input, input.length); + assertArrayEquals(expected, input, "The sorted array does not match the expected output"); + } + + @Test + void testRadixSortWithEmptyArray() { + int[] input = {}; + int[] expected = {}; + + Radix.radixsort(input, input.length); + assertArrayEquals(expected, input, "The sorted array does not match the expected output"); + } +} diff --git a/README.md b/README.md index cb3d676..8a34e11 100644 --- a/README.md +++ b/README.md @@ -126,6 +126,8 @@ It is very easy to contribute, you may follow these steps - 99.[RotateLinkedList](https://github.com/PrajaktaSathe/Java/blob/main/Programs/RotateLinkedList.java)-Program to demo rotating a linked list 100. [ReverseString](https://github.com/PrajaktaSathe/Java/blob/main/ReverseString.java) -Program to reverse a String using the java method substring. 101.[Overriding](https://github.com/PrajaktaSathe/Java/blob/main/Programs/Overriding.java)-Program to demo overriding in java +102. [Radix Sort](https://github.com/PrajaktaSathe/Java/blob/main/Programs/Radix/RadixSort.java)-Program to demo Radix Sort in java + # Contributors - ## A big thank you to all our contributors!!!