From affe6fe7bb8cbab9c5d58f31eaac3fce6938d34a Mon Sep 17 00:00:00 2001 From: dinishajais Date: Wed, 23 Jul 2025 00:45:08 +0530 Subject: [PATCH 1/2] Refactored all the compareTo() to SortUtils functions. --- .../java/com/thealgorithms/sorts/AdaptiveMergeSort.java | 2 +- .../java/com/thealgorithms/sorts/BinaryInsertionSort.java | 2 +- src/main/java/com/thealgorithms/sorts/BitonicSort.java | 2 +- src/main/java/com/thealgorithms/sorts/BucketSort.java | 4 ++-- src/main/java/com/thealgorithms/sorts/CircleSort.java | 4 ++-- .../com/thealgorithms/sorts/DutchNationalFlagSort.java | 4 ++-- src/main/java/com/thealgorithms/sorts/ExchangeSort.java | 2 +- .../java/com/thealgorithms/sorts/IntrospectiveSort.java | 8 ++++---- src/main/java/com/thealgorithms/sorts/OddEvenSort.java | 4 ++-- src/main/java/com/thealgorithms/sorts/SelectionSort.java | 2 +- .../com/thealgorithms/sorts/SelectionSortRecursive.java | 2 +- src/main/java/com/thealgorithms/sorts/StalinSort.java | 2 +- 12 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/thealgorithms/sorts/AdaptiveMergeSort.java b/src/main/java/com/thealgorithms/sorts/AdaptiveMergeSort.java index 2c71bae8b557..e82ab99c10f3 100644 --- a/src/main/java/com/thealgorithms/sorts/AdaptiveMergeSort.java +++ b/src/main/java/com/thealgorithms/sorts/AdaptiveMergeSort.java @@ -30,7 +30,7 @@ private > void merge(T[] array, T[] aux, int low, int mi array[k] = aux[j++]; } else if (j > high) { array[k] = aux[i++]; - } else if (aux[j].compareTo(aux[i]) < 0) { + } else if (SortUtils.less(aux[j],aux[i])) { array[k] = aux[j++]; } else { array[k] = aux[i++]; diff --git a/src/main/java/com/thealgorithms/sorts/BinaryInsertionSort.java b/src/main/java/com/thealgorithms/sorts/BinaryInsertionSort.java index b6f5d92e7928..b8086bd0ebca 100644 --- a/src/main/java/com/thealgorithms/sorts/BinaryInsertionSort.java +++ b/src/main/java/com/thealgorithms/sorts/BinaryInsertionSort.java @@ -22,7 +22,7 @@ public > T[] sort(T[] array) { while (low <= high) { final int mid = (low + high) >>> 1; - if (temp.compareTo(array[mid]) < 0) { + if (SortUtils.less(temp, array[mid])) { high = mid - 1; } else { low = mid + 1; diff --git a/src/main/java/com/thealgorithms/sorts/BitonicSort.java b/src/main/java/com/thealgorithms/sorts/BitonicSort.java index 90d204818729..03b275758b83 100644 --- a/src/main/java/com/thealgorithms/sorts/BitonicSort.java +++ b/src/main/java/com/thealgorithms/sorts/BitonicSort.java @@ -64,7 +64,7 @@ private > void bitonicMerge(T[] array, int low, int cnt, if (cnt > 1) { final int k = cnt / 2; - final BiPredicate areSorted = (direction == Direction.ASCENDING) ? (a, b) -> a.compareTo(b) < 0 : (a, b) -> a.compareTo(b) > 0; + final BiPredicate areSorted = (direction == Direction.ASCENDING) ? (a, b) -> SortUtils.less(a,b) : (a, b) -> SortUtils.greater(a,b); for (int i = low; i < low + k; i++) { if (!areSorted.test(array[i], array[i + k])) { SortUtils.swap(array, i, i + k); diff --git a/src/main/java/com/thealgorithms/sorts/BucketSort.java b/src/main/java/com/thealgorithms/sorts/BucketSort.java index 62c5e929593b..fb44a9508b6c 100644 --- a/src/main/java/com/thealgorithms/sorts/BucketSort.java +++ b/src/main/java/com/thealgorithms/sorts/BucketSort.java @@ -111,7 +111,7 @@ private > int hash(final T element, final T min, final T private > T findMin(T[] array) { T min = array[0]; for (T element : array) { - if (element.compareTo(min) < 0) { + if (SortUtils.less(element,min)) { min = element; } } @@ -121,7 +121,7 @@ private > T findMin(T[] array) { private > T findMax(T[] array) { T max = array[0]; for (T element : array) { - if (element.compareTo(max) > 0) { + if (SortUtils.greater(element,max)) { max = element; } } diff --git a/src/main/java/com/thealgorithms/sorts/CircleSort.java b/src/main/java/com/thealgorithms/sorts/CircleSort.java index b9b41be16701..ddfeabb46334 100644 --- a/src/main/java/com/thealgorithms/sorts/CircleSort.java +++ b/src/main/java/com/thealgorithms/sorts/CircleSort.java @@ -36,7 +36,7 @@ private > boolean doSort(final T[] array, final int left int high = right; while (low < high) { - if (array[low].compareTo(array[high]) > 0) { + if (SortUtils.greater(array[low],array[high] )) { SortUtils.swap(array, low, high); swapped = true; } @@ -44,7 +44,7 @@ private > boolean doSort(final T[] array, final int left high--; } - if (low == high && array[low].compareTo(array[high + 1]) > 0) { + if (low == high && SortUtils.greater(array[low],array[high + 1])) { SortUtils.swap(array, low, high + 1); swapped = true; } diff --git a/src/main/java/com/thealgorithms/sorts/DutchNationalFlagSort.java b/src/main/java/com/thealgorithms/sorts/DutchNationalFlagSort.java index abfcb452b29a..8300554f12b8 100644 --- a/src/main/java/com/thealgorithms/sorts/DutchNationalFlagSort.java +++ b/src/main/java/com/thealgorithms/sorts/DutchNationalFlagSort.java @@ -26,11 +26,11 @@ private > T[] dutchNationalFlagSort(final T[] array, fin int k = array.length - 1; while (j <= k) { - if (0 > array[j].compareTo(intendedMiddle)) { + if (SortUtils.less(array[j],intendedMiddle)) { SortUtils.swap(array, i, j); j++; i++; - } else if (0 < array[j].compareTo(intendedMiddle)) { + } else if (SortUtils.greater(array[j],intendedMiddle)) { SortUtils.swap(array, j, k); k--; } else { diff --git a/src/main/java/com/thealgorithms/sorts/ExchangeSort.java b/src/main/java/com/thealgorithms/sorts/ExchangeSort.java index 67e94b889671..59c8b462e41b 100644 --- a/src/main/java/com/thealgorithms/sorts/ExchangeSort.java +++ b/src/main/java/com/thealgorithms/sorts/ExchangeSort.java @@ -31,7 +31,7 @@ class ExchangeSort implements SortAlgorithm { public > T[] sort(T[] array) { for (int i = 0; i < array.length - 1; i++) { for (int j = i + 1; j < array.length; j++) { - if (array[i].compareTo(array[j]) > 0) { + if (SortUtils.greater(array[i],array[j])) { SortUtils.swap(array, i, j); } } diff --git a/src/main/java/com/thealgorithms/sorts/IntrospectiveSort.java b/src/main/java/com/thealgorithms/sorts/IntrospectiveSort.java index 12ef197b931b..7a18841aab57 100644 --- a/src/main/java/com/thealgorithms/sorts/IntrospectiveSort.java +++ b/src/main/java/com/thealgorithms/sorts/IntrospectiveSort.java @@ -63,7 +63,7 @@ private static > int partition(T[] array, final int low, final T pivot = array[high]; int i = low - 1; for (int j = low; j < high; j++) { - if (array[j].compareTo(pivot) <= 0) { + if(SortUtils.greaterOrEqual(pivot, array[j])) { i++; SortUtils.swap(array, i, j); } @@ -84,7 +84,7 @@ private static > void insertionSort(T[] array, final int for (int i = low + 1; i <= high; i++) { final T key = array[i]; int j = i - 1; - while (j >= low && array[j].compareTo(key) > 0) { + while (j >= low && SortUtils.greater(array[j],key)) { array[j + 1] = array[j]; j--; } @@ -125,10 +125,10 @@ private static > void heapify(T[] array, final int i, fi final int right = 2 * i + 2; int largest = i; - if (left < n && array[low + left].compareTo(array[low + largest]) > 0) { + if (left < n && SortUtils.greater(array[low + left],array[low + largest])) { largest = left; } - if (right < n && array[low + right].compareTo(array[low + largest]) > 0) { + if (right < n && SortUtils.greater(array[low + left],array[low + largest])) { largest = right; } if (largest != i) { diff --git a/src/main/java/com/thealgorithms/sorts/OddEvenSort.java b/src/main/java/com/thealgorithms/sorts/OddEvenSort.java index ac94982c1474..bb06edbfa4fe 100644 --- a/src/main/java/com/thealgorithms/sorts/OddEvenSort.java +++ b/src/main/java/com/thealgorithms/sorts/OddEvenSort.java @@ -30,7 +30,7 @@ public > T[] sort(T[] array) { private > boolean performOddSort(T[] array) { boolean sorted = true; for (int i = 1; i < array.length - 1; i += 2) { - if (array[i].compareTo(array[i + 1]) > 0) { + if (SortUtils.greater(array[i],array[i + 1])) { SortUtils.swap(array, i, i + 1); sorted = false; } @@ -41,7 +41,7 @@ private > boolean performOddSort(T[] array) { private > boolean performEvenSort(T[] array) { boolean sorted = true; for (int i = 0; i < array.length - 1; i += 2) { - if (array[i].compareTo(array[i + 1]) > 0) { + if (SortUtils.greater(array[i],array[i + 1])) { SortUtils.swap(array, i, i + 1); sorted = false; } diff --git a/src/main/java/com/thealgorithms/sorts/SelectionSort.java b/src/main/java/com/thealgorithms/sorts/SelectionSort.java index dbb2b88ffcef..2c3a8321e984 100644 --- a/src/main/java/com/thealgorithms/sorts/SelectionSort.java +++ b/src/main/java/com/thealgorithms/sorts/SelectionSort.java @@ -21,7 +21,7 @@ public > T[] sort(T[] array) { private static > int findIndexOfMin(T[] array, final int startIndex) { int minIndex = startIndex; for (int i = startIndex + 1; i < array.length; i++) { - if (array[i].compareTo(array[minIndex]) < 0) { + if (SortUtils.less(array[i],array[minIndex])) { minIndex = i; } } diff --git a/src/main/java/com/thealgorithms/sorts/SelectionSortRecursive.java b/src/main/java/com/thealgorithms/sorts/SelectionSortRecursive.java index 9d24542de592..2814a64401d3 100644 --- a/src/main/java/com/thealgorithms/sorts/SelectionSortRecursive.java +++ b/src/main/java/com/thealgorithms/sorts/SelectionSortRecursive.java @@ -56,6 +56,6 @@ private static > int findMinIndex(T[] array, final int s final int minIndexInRest = findMinIndex(array, start + 1); // Return the index of the smaller element between array[start] and the minimum element in the rest of the array - return array[start].compareTo(array[minIndexInRest]) < 0 ? start : minIndexInRest; + return SortUtils.less(array[start],array[minIndexInRest]) ? start : minIndexInRest; } } diff --git a/src/main/java/com/thealgorithms/sorts/StalinSort.java b/src/main/java/com/thealgorithms/sorts/StalinSort.java index 5aaf530fd94c..6d55ae72abe1 100644 --- a/src/main/java/com/thealgorithms/sorts/StalinSort.java +++ b/src/main/java/com/thealgorithms/sorts/StalinSort.java @@ -8,7 +8,7 @@ public > T[] sort(T[] array) { } int currentIndex = 0; for (int i = 1; i < array.length; i++) { - if (array[i].compareTo(array[currentIndex]) >= 0) { + if (SortUtils.greaterOrEqual(array[i],array[currentIndex])) { currentIndex++; array[currentIndex] = array[i]; } From d87dad630dcfabc70887c89023781b11b138482e Mon Sep 17 00:00:00 2001 From: dinishajais Date: Thu, 24 Jul 2025 18:52:03 +0530 Subject: [PATCH 2/2] Added formatting --- .../sorts/AdaptiveMergeSort.java | 68 ++--- .../com/thealgorithms/sorts/BitonicSort.java | 210 +++++++-------- .../com/thealgorithms/sorts/BucketSort.java | 218 +++++++-------- .../com/thealgorithms/sorts/CircleSort.java | 108 ++++---- .../sorts/DutchNationalFlagSort.java | 64 ++--- .../com/thealgorithms/sorts/ExchangeSort.java | 48 ++-- .../sorts/IntrospectiveSort.java | 249 +++++++++--------- .../com/thealgorithms/sorts/OddEvenSort.java | 83 +++--- .../thealgorithms/sorts/SelectionSort.java | 49 ++-- .../sorts/SelectionSortRecursive.java | 108 ++++---- .../com/thealgorithms/sorts/StalinSort.java | 34 +-- 11 files changed, 629 insertions(+), 610 deletions(-) diff --git a/src/main/java/com/thealgorithms/sorts/AdaptiveMergeSort.java b/src/main/java/com/thealgorithms/sorts/AdaptiveMergeSort.java index e82ab99c10f3..8d2b6c59f864 100644 --- a/src/main/java/com/thealgorithms/sorts/AdaptiveMergeSort.java +++ b/src/main/java/com/thealgorithms/sorts/AdaptiveMergeSort.java @@ -1,40 +1,40 @@ package com.thealgorithms.sorts; public class AdaptiveMergeSort implements SortAlgorithm { - @SuppressWarnings("unchecked") - public > T[] sort(T[] array) { - if (array.length <= 1) { - return array; - } - T[] aux = array.clone(); - sort(array, aux, 0, array.length - 1); - return array; - } + @SuppressWarnings("unchecked") + public > T[] sort(T[] array) { + if (array.length <= 1) { + return array; + } + T[] aux = array.clone(); + sort(array, aux, 0, array.length - 1); + return array; + } - private > void sort(T[] array, T[] aux, int low, int high) { - if (low >= high) { - return; - } - int mid = low + (high - low) / 2; - sort(array, aux, low, mid); - sort(array, aux, mid + 1, high); - merge(array, aux, low, mid, high); - } + private > void sort(T[] array, T[] aux, int low, int high) { + if (low >= high) { + return; + } + int mid = low + (high - low) / 2; + sort(array, aux, low, mid); + sort(array, aux, mid + 1, high); + merge(array, aux, low, mid, high); + } - private > void merge(T[] array, T[] aux, int low, int mid, int high) { - System.arraycopy(array, low, aux, low, high - low + 1); - int i = low; - int j = mid + 1; - for (int k = low; k <= high; k++) { - if (i > mid) { - array[k] = aux[j++]; - } else if (j > high) { - array[k] = aux[i++]; - } else if (SortUtils.less(aux[j],aux[i])) { - array[k] = aux[j++]; - } else { - array[k] = aux[i++]; - } - } - } + private > void merge(T[] array, T[] aux, int low, int mid, int high) { + System.arraycopy(array, low, aux, low, high - low + 1); + int i = low; + int j = mid + 1; + for (int k = low; k <= high; k++) { + if (i > mid) { + array[k] = aux[j++]; + } else if (j > high) { + array[k] = aux[i++]; + } else if (SortUtils.less(aux[j], aux[i])) { + array[k] = aux[j++]; + } else { + array[k] = aux[i++]; + } + } + } } diff --git a/src/main/java/com/thealgorithms/sorts/BitonicSort.java b/src/main/java/com/thealgorithms/sorts/BitonicSort.java index 03b275758b83..f93171736e19 100644 --- a/src/main/java/com/thealgorithms/sorts/BitonicSort.java +++ b/src/main/java/com/thealgorithms/sorts/BitonicSort.java @@ -4,109 +4,113 @@ import java.util.function.BiPredicate; /** - * BitonicSort class implements the SortAlgorithm interface using the bitonic sort technique. + * BitonicSort class implements the SortAlgorithm interface using the bitonic + * sort technique. */ public class BitonicSort implements SortAlgorithm { - private enum Direction { - DESCENDING, - ASCENDING, - } - - /** - * Sorts the given array using the Bitonic Sort algorithm. - * - * @param the type of elements in the array, which must implement the Comparable interface - * @param array the array to be sorted - * @return the sorted array - */ - @Override - public > T[] sort(T[] array) { - if (array.length == 0) { - return array; - } - - final int paddedSize = nextPowerOfTwo(array.length); - T[] paddedArray = Arrays.copyOf(array, paddedSize); - - // Fill the padded part with a maximum value - final T maxValue = max(array); - Arrays.fill(paddedArray, array.length, paddedSize, maxValue); - - bitonicSort(paddedArray, 0, paddedSize, Direction.ASCENDING); - return Arrays.copyOf(paddedArray, array.length); - } - - private > void bitonicSort(final T[] array, final int low, final int cnt, final Direction direction) { - if (cnt > 1) { - final int k = cnt / 2; - - // Sort first half in ascending order - bitonicSort(array, low, k, Direction.ASCENDING); - - // Sort second half in descending order - bitonicSort(array, low + k, cnt - k, Direction.DESCENDING); - - // Merge the whole sequence in ascending order - bitonicMerge(array, low, cnt, direction); - } - } - - /** - * Merges the bitonic sequence in the specified direction. - * - * @param the type of elements in the array, which must be Comparable - * @param array the array containing the bitonic sequence to be merged - * @param low the starting index of the sequence to be merged - * @param cnt the number of elements in the sequence to be merged - * @param direction the direction of sorting - */ - private > void bitonicMerge(T[] array, int low, int cnt, Direction direction) { - if (cnt > 1) { - final int k = cnt / 2; - - final BiPredicate areSorted = (direction == Direction.ASCENDING) ? (a, b) -> SortUtils.less(a,b) : (a, b) -> SortUtils.greater(a,b); - for (int i = low; i < low + k; i++) { - if (!areSorted.test(array[i], array[i + k])) { - SortUtils.swap(array, i, i + k); - } - } - - bitonicMerge(array, low, k, direction); - bitonicMerge(array, low + k, cnt - k, direction); - } - } - - /** - * Finds the next power of two greater than or equal to the given number. - * - * @param n the number - * @return the next power of two - */ - private static int nextPowerOfTwo(int n) { - int count = 0; - - // First n in the below condition is for the case where n is 0 - if ((n & (n - 1)) == 0) { - return n; - } - - while (n != 0) { - n >>= 1; - count += 1; - } - - return 1 << count; - } - - /** - * Finds the maximum element in the given array. - * - * @param the type of elements in the array, which must implement the Comparable interface - * @param array the array to be searched - * @return the maximum element in the array - * @throws IllegalArgumentException if the array is null or empty - */ - private static > T max(final T[] array) { - return Arrays.stream(array).max(Comparable::compareTo).orElseThrow(); - } + private enum Direction { + DESCENDING, ASCENDING, + } + + /** + * Sorts the given array using the Bitonic Sort algorithm. + * + * @param the type of elements in the array, which must implement the + * Comparable interface + * @param array the array to be sorted + * @return the sorted array + */ + @Override + public > T[] sort(T[] array) { + if (array.length == 0) { + return array; + } + + final int paddedSize = nextPowerOfTwo(array.length); + T[] paddedArray = Arrays.copyOf(array, paddedSize); + + // Fill the padded part with a maximum value + final T maxValue = max(array); + Arrays.fill(paddedArray, array.length, paddedSize, maxValue); + + bitonicSort(paddedArray, 0, paddedSize, Direction.ASCENDING); + return Arrays.copyOf(paddedArray, array.length); + } + + private > void bitonicSort(final T[] array, final int low, final int cnt, + final Direction direction) { + if (cnt > 1) { + final int k = cnt / 2; + + // Sort first half in ascending order + bitonicSort(array, low, k, Direction.ASCENDING); + + // Sort second half in descending order + bitonicSort(array, low + k, cnt - k, Direction.DESCENDING); + + // Merge the whole sequence in ascending order + bitonicMerge(array, low, cnt, direction); + } + } + + /** + * Merges the bitonic sequence in the specified direction. + * + * @param the type of elements in the array, which must be Comparable + * @param array the array containing the bitonic sequence to be merged + * @param low the starting index of the sequence to be merged + * @param cnt the number of elements in the sequence to be merged + * @param direction the direction of sorting + */ + private > void bitonicMerge(T[] array, int low, int cnt, Direction direction) { + if (cnt > 1) { + final int k = cnt / 2; + + final BiPredicate areSorted = (direction == Direction.ASCENDING) ? (a, b) -> SortUtils.less(a, b) + : (a, b) -> SortUtils.greater(a, b); + for (int i = low; i < low + k; i++) { + if (!areSorted.test(array[i], array[i + k])) { + SortUtils.swap(array, i, i + k); + } + } + + bitonicMerge(array, low, k, direction); + bitonicMerge(array, low + k, cnt - k, direction); + } + } + + /** + * Finds the next power of two greater than or equal to the given number. + * + * @param n the number + * @return the next power of two + */ + private static int nextPowerOfTwo(int n) { + int count = 0; + + // First n in the below condition is for the case where n is 0 + if ((n & (n - 1)) == 0) { + return n; + } + + while (n != 0) { + n >>= 1; + count += 1; + } + + return 1 << count; + } + + /** + * Finds the maximum element in the given array. + * + * @param the type of elements in the array, which must implement the + * Comparable interface + * @param array the array to be searched + * @return the maximum element in the array + * @throws IllegalArgumentException if the array is null or empty + */ + private static > T max(final T[] array) { + return Arrays.stream(array).max(Comparable::compareTo).orElseThrow(); + } } diff --git a/src/main/java/com/thealgorithms/sorts/BucketSort.java b/src/main/java/com/thealgorithms/sorts/BucketSort.java index fb44a9508b6c..948192ed05f2 100644 --- a/src/main/java/com/thealgorithms/sorts/BucketSort.java +++ b/src/main/java/com/thealgorithms/sorts/BucketSort.java @@ -5,126 +5,128 @@ import java.util.List; /** - * BucketSort class provides a method to sort an array of elements using the Bucket Sort algorithm - * and implements the SortAlgorithm interface. + * BucketSort class provides a method to sort an array of elements using the + * Bucket Sort algorithm and implements the SortAlgorithm interface. */ public class BucketSort implements SortAlgorithm { - // Constant that defines the divisor for determining the number of buckets - private static final int BUCKET_DIVISOR = 10; + // Constant that defines the divisor for determining the number of buckets + private static final int BUCKET_DIVISOR = 10; - @Override - public > T[] sort(T[] array) { - if (array.length == 0) { - return array; - } + @Override + public > T[] sort(T[] array) { + if (array.length == 0) { + return array; + } - T min = findMin(array); - T max = findMax(array); - int numberOfBuckets = calculateNumberOfBuckets(array.length); + T min = findMin(array); + T max = findMax(array); + int numberOfBuckets = calculateNumberOfBuckets(array.length); - List> buckets = initializeBuckets(numberOfBuckets); - distributeElementsIntoBuckets(array, buckets, min, max, numberOfBuckets); + List> buckets = initializeBuckets(numberOfBuckets); + distributeElementsIntoBuckets(array, buckets, min, max, numberOfBuckets); - return concatenateBuckets(buckets, array); - } + return concatenateBuckets(buckets, array); + } - /** - * Calculates the number of buckets to use based on the size of the array. - * - * @param arrayLength the length of the array - * @return the number of buckets - */ - private int calculateNumberOfBuckets(final int arrayLength) { - return Math.max(arrayLength / BUCKET_DIVISOR, 1); - } + /** + * Calculates the number of buckets to use based on the size of the array. + * + * @param arrayLength the length of the array + * @return the number of buckets + */ + private int calculateNumberOfBuckets(final int arrayLength) { + return Math.max(arrayLength / BUCKET_DIVISOR, 1); + } - /** - * Initializes a list of empty buckets. - * - * @param numberOfBuckets the number of buckets to initialize - * @param the type of elements to be sorted - * @return a list of empty buckets - */ - private > List> initializeBuckets(int numberOfBuckets) { - List> buckets = new ArrayList<>(numberOfBuckets); - for (int i = 0; i < numberOfBuckets; i++) { - buckets.add(new ArrayList<>()); - } - return buckets; - } + /** + * Initializes a list of empty buckets. + * + * @param numberOfBuckets the number of buckets to initialize + * @param the type of elements to be sorted + * @return a list of empty buckets + */ + private > List> initializeBuckets(int numberOfBuckets) { + List> buckets = new ArrayList<>(numberOfBuckets); + for (int i = 0; i < numberOfBuckets; i++) { + buckets.add(new ArrayList<>()); + } + return buckets; + } - /** - * Distributes elements from the array into the appropriate buckets. - * - * @param array the array of elements to distribute - * @param buckets the list of buckets - * @param min the minimum value in the array - * @param max the maximum value in the array - * @param numberOfBuckets the total number of buckets - * @param the type of elements in the array - */ - private > void distributeElementsIntoBuckets(T[] array, List> buckets, final T min, final T max, final int numberOfBuckets) { - for (final T element : array) { - int bucketIndex = hash(element, min, max, numberOfBuckets); - buckets.get(bucketIndex).add(element); - } - } + /** + * Distributes elements from the array into the appropriate buckets. + * + * @param array the array of elements to distribute + * @param buckets the list of buckets + * @param min the minimum value in the array + * @param max the maximum value in the array + * @param numberOfBuckets the total number of buckets + * @param the type of elements in the array + */ + private > void distributeElementsIntoBuckets(T[] array, List> buckets, final T min, + final T max, final int numberOfBuckets) { + for (final T element : array) { + int bucketIndex = hash(element, min, max, numberOfBuckets); + buckets.get(bucketIndex).add(element); + } + } - /** - * Concatenates the sorted buckets back into the original array. - * - * @param buckets the list of sorted buckets - * @param array the original array - * @param the type of elements in the array - * @return the sorted array - */ - private > T[] concatenateBuckets(Iterable> buckets, T[] array) { - int index = 0; - for (List bucket : buckets) { - Collections.sort(bucket); - for (T element : bucket) { - array[index++] = element; - } - } - return array; - } + /** + * Concatenates the sorted buckets back into the original array. + * + * @param buckets the list of sorted buckets + * @param array the original array + * @param the type of elements in the array + * @return the sorted array + */ + private > T[] concatenateBuckets(Iterable> buckets, T[] array) { + int index = 0; + for (List bucket : buckets) { + Collections.sort(bucket); + for (T element : bucket) { + array[index++] = element; + } + } + return array; + } - /** - * The method computes the index of the bucket in which a given element should be placed. - * This is done by "normalizing" the element within the range of the array's minimum (min) and maximum (max) values, - * and then mapping this normalized value to a specific bucket index. - * - * @param element the element of the array - * @param min the minimum value in the array - * @param max the maximum value in the array - * @param numberOfBuckets the total number of buckets - * @param the type of elements in the array - * @return the index of the bucket - */ - private > int hash(final T element, final T min, final T max, final int numberOfBuckets) { - double range = max.compareTo(min); - double normalizedValue = element.compareTo(min) / range; - return (int) (normalizedValue * (numberOfBuckets - 1)); - } + /** + * The method computes the index of the bucket in which a given element should + * be placed. This is done by "normalizing" the element within the range of the + * array's minimum (min) and maximum (max) values, and then mapping this + * normalized value to a specific bucket index. + * + * @param element the element of the array + * @param min the minimum value in the array + * @param max the maximum value in the array + * @param numberOfBuckets the total number of buckets + * @param the type of elements in the array + * @return the index of the bucket + */ + private > int hash(final T element, final T min, final T max, final int numberOfBuckets) { + double range = max.compareTo(min); + double normalizedValue = element.compareTo(min) / range; + return (int) (normalizedValue * (numberOfBuckets - 1)); + } - private > T findMin(T[] array) { - T min = array[0]; - for (T element : array) { - if (SortUtils.less(element,min)) { - min = element; - } - } - return min; - } + private > T findMin(T[] array) { + T min = array[0]; + for (T element : array) { + if (SortUtils.less(element, min)) { + min = element; + } + } + return min; + } - private > T findMax(T[] array) { - T max = array[0]; - for (T element : array) { - if (SortUtils.greater(element,max)) { - max = element; - } - } - return max; - } + private > T findMax(T[] array) { + T max = array[0]; + for (T element : array) { + if (SortUtils.greater(element, max)) { + max = element; + } + } + return max; + } } diff --git a/src/main/java/com/thealgorithms/sorts/CircleSort.java b/src/main/java/com/thealgorithms/sorts/CircleSort.java index ddfeabb46334..335e1f11d80a 100644 --- a/src/main/java/com/thealgorithms/sorts/CircleSort.java +++ b/src/main/java/com/thealgorithms/sorts/CircleSort.java @@ -2,57 +2,59 @@ public class CircleSort implements SortAlgorithm { - /* This method implements the circle sort - * @param array The array to be sorted - */ - @Override - public > T[] sort(T[] array) { - if (array.length == 0) { - return array; - } - while (doSort(array, 0, array.length - 1)) { - } - return array; - } - - /** - * Recursively sorts the array in a circular manner by comparing elements - * from the start and end of the current segment. - * - * @param The type of elements in the array, which must be comparable - * @param array The array to be sorted - * @param left The left boundary of the current segment being sorted - * @param right The right boundary of the current segment being sorted - * @return true if any elements were swapped during the sort; false otherwise - */ - private > boolean doSort(final T[] array, final int left, final int right) { - boolean swapped = false; - - if (left == right) { - return false; - } - - int low = left; - int high = right; - - while (low < high) { - if (SortUtils.greater(array[low],array[high] )) { - SortUtils.swap(array, low, high); - swapped = true; - } - low++; - high--; - } - - if (low == high && SortUtils.greater(array[low],array[high + 1])) { - SortUtils.swap(array, low, high + 1); - swapped = true; - } - - final int mid = left + (right - left) / 2; - final boolean leftHalfSwapped = doSort(array, left, mid); - final boolean rightHalfSwapped = doSort(array, mid + 1, right); - - return swapped || leftHalfSwapped || rightHalfSwapped; - } + /* + * This method implements the circle sort + * + * @param array The array to be sorted + */ + @Override + public > T[] sort(T[] array) { + if (array.length == 0) { + return array; + } + while (doSort(array, 0, array.length - 1)) { + } + return array; + } + + /** + * Recursively sorts the array in a circular manner by comparing elements from + * the start and end of the current segment. + * + * @param The type of elements in the array, which must be comparable + * @param array The array to be sorted + * @param left The left boundary of the current segment being sorted + * @param right The right boundary of the current segment being sorted + * @return true if any elements were swapped during the sort; false otherwise + */ + private > boolean doSort(final T[] array, final int left, final int right) { + boolean swapped = false; + + if (left == right) { + return false; + } + + int low = left; + int high = right; + + while (low < high) { + if (SortUtils.greater(array[low], array[high])) { + SortUtils.swap(array, low, high); + swapped = true; + } + low++; + high--; + } + + if (low == high && SortUtils.greater(array[low], array[high + 1])) { + SortUtils.swap(array, low, high + 1); + swapped = true; + } + + final int mid = left + (right - left) / 2; + final boolean leftHalfSwapped = doSort(array, left, mid); + final boolean rightHalfSwapped = doSort(array, mid + 1, right); + + return swapped || leftHalfSwapped || rightHalfSwapped; + } } diff --git a/src/main/java/com/thealgorithms/sorts/DutchNationalFlagSort.java b/src/main/java/com/thealgorithms/sorts/DutchNationalFlagSort.java index 8300554f12b8..62f5b84eeebb 100644 --- a/src/main/java/com/thealgorithms/sorts/DutchNationalFlagSort.java +++ b/src/main/java/com/thealgorithms/sorts/DutchNationalFlagSort.java @@ -1,42 +1,44 @@ package com.thealgorithms.sorts; /** - * The Dutch National Flag Sort sorts a sequence of values into three permutations which are defined - * by a value given as the indented middle. First permutation: values less than middle. Second - * permutation: values equal middle. Third permutation: values greater than middle. If no indented - * middle is given, this implementation will use a value from the given Array. This value is the one - * positioned in the arrays' middle if the arrays' length is odd. If the arrays' length is even, the - * value left to the middle will be used. More information and Pseudocode: + * The Dutch National Flag Sort sorts a sequence of values into three + * permutations which are defined by a value given as the indented middle. First + * permutation: values less than middle. Second permutation: values equal + * middle. Third permutation: values greater than middle. If no indented middle + * is given, this implementation will use a value from the given Array. This + * value is the one positioned in the arrays' middle if the arrays' length is + * odd. If the arrays' length is even, the value left to the middle will be + * used. More information and Pseudocode: * https://en.wikipedia.org/wiki/Dutch_national_flag_problem */ public class DutchNationalFlagSort implements SortAlgorithm { - @Override - public > T[] sort(T[] array) { - return dutchNationalFlagSort(array, array[(int) Math.ceil((array.length) / 2.0) - 1]); - } + @Override + public > T[] sort(T[] array) { + return dutchNationalFlagSort(array, array[(int) Math.ceil((array.length) / 2.0) - 1]); + } - public > T[] sort(T[] array, T intendedMiddle) { - return dutchNationalFlagSort(array, intendedMiddle); - } + public > T[] sort(T[] array, T intendedMiddle) { + return dutchNationalFlagSort(array, intendedMiddle); + } - private > T[] dutchNationalFlagSort(final T[] array, final T intendedMiddle) { - int i = 0; - int j = 0; - int k = array.length - 1; + private > T[] dutchNationalFlagSort(final T[] array, final T intendedMiddle) { + int i = 0; + int j = 0; + int k = array.length - 1; - while (j <= k) { - if (SortUtils.less(array[j],intendedMiddle)) { - SortUtils.swap(array, i, j); - j++; - i++; - } else if (SortUtils.greater(array[j],intendedMiddle)) { - SortUtils.swap(array, j, k); - k--; - } else { - j++; - } - } - return array; - } + while (j <= k) { + if (SortUtils.less(array[j], intendedMiddle)) { + SortUtils.swap(array, i, j); + j++; + i++; + } else if (SortUtils.greater(array[j], intendedMiddle)) { + SortUtils.swap(array, j, k); + k--; + } else { + j++; + } + } + return array; + } } diff --git a/src/main/java/com/thealgorithms/sorts/ExchangeSort.java b/src/main/java/com/thealgorithms/sorts/ExchangeSort.java index 59c8b462e41b..75af42bbe28d 100644 --- a/src/main/java/com/thealgorithms/sorts/ExchangeSort.java +++ b/src/main/java/com/thealgorithms/sorts/ExchangeSort.java @@ -5,12 +5,12 @@ * *

* Exchange sort works by comparing each element with all subsequent elements, - * swapping where needed, to ensure the correct placement of each element - * in the final sorted order. It iteratively performs this process for each - * element in the array. While it lacks the advantage of bubble sort in - * detecting sorted lists in one pass, it can be more efficient than bubble sort - * due to a constant factor (one less pass over the data to be sorted; half as - * many total comparisons) in worst-case scenarios. + * swapping where needed, to ensure the correct placement of each element in the + * final sorted order. It iteratively performs this process for each element in + * the array. While it lacks the advantage of bubble sort in detecting sorted + * lists in one pass, it can be more efficient than bubble sort due to a + * constant factor (one less pass over the data to be sorted; half as many total + * comparisons) in worst-case scenarios. *

* *

@@ -20,22 +20,22 @@ * @author 555vedant (Vedant Kasar) */ class ExchangeSort implements SortAlgorithm { - /** - * Implementation of Exchange Sort Algorithm - * - * @param array the array to be sorted. - * @param the type of elements in the array. - * @return the sorted array. - */ - @Override - public > T[] sort(T[] array) { - for (int i = 0; i < array.length - 1; i++) { - for (int j = i + 1; j < array.length; j++) { - if (SortUtils.greater(array[i],array[j])) { - SortUtils.swap(array, i, j); - } - } - } - return array; - } + /** + * Implementation of Exchange Sort Algorithm + * + * @param array the array to be sorted. + * @param the type of elements in the array. + * @return the sorted array. + */ + @Override + public > T[] sort(T[] array) { + for (int i = 0; i < array.length - 1; i++) { + for (int j = i + 1; j < array.length; j++) { + if (SortUtils.greater(array[i], array[j])) { + SortUtils.swap(array, i, j); + } + } + } + return array; + } } diff --git a/src/main/java/com/thealgorithms/sorts/IntrospectiveSort.java b/src/main/java/com/thealgorithms/sorts/IntrospectiveSort.java index 7a18841aab57..67001d2ea51e 100644 --- a/src/main/java/com/thealgorithms/sorts/IntrospectiveSort.java +++ b/src/main/java/com/thealgorithms/sorts/IntrospectiveSort.java @@ -3,137 +3,140 @@ /** * Introspective Sort Algorithm Implementation * - * @see IntroSort Algorithm + * @see IntroSort + * Algorithm */ public class IntrospectiveSort implements SortAlgorithm { - private static final int INSERTION_SORT_THRESHOLD = 16; + private static final int INSERTION_SORT_THRESHOLD = 16; - /** - * Sorts the given array using Introspective Sort, which combines quicksort, heapsort, and insertion sort. - * - * @param array The array to be sorted - * @param The type of elements in the array, which must be comparable - * @return The sorted array - */ - @Override - public > T[] sort(T[] array) { - if (array == null || array.length <= 1) { - return array; - } - final int depth = 2 * (int) (Math.log(array.length) / Math.log(2)); - introspectiveSort(array, 0, array.length - 1, depth); - return array; - } + /** + * Sorts the given array using Introspective Sort, which combines quicksort, + * heapsort, and insertion sort. + * + * @param array The array to be sorted + * @param The type of elements in the array, which must be comparable + * @return The sorted array + */ + @Override + public > T[] sort(T[] array) { + if (array == null || array.length <= 1) { + return array; + } + final int depth = 2 * (int) (Math.log(array.length) / Math.log(2)); + introspectiveSort(array, 0, array.length - 1, depth); + return array; + } - /** - * Performs introspective sort on the specified subarray. - * - * @param array The array to be sorted - * @param low The starting index of the subarray - * @param high The ending index of the subarray - * @param depth The current depth of recursion - * @param The type of elements in the array, which must be comparable - */ - private static > void introspectiveSort(T[] array, final int low, int high, final int depth) { - while (high - low > INSERTION_SORT_THRESHOLD) { - if (depth == 0) { - heapSort(array, low, high); - return; - } - final int pivotIndex = partition(array, low, high); - introspectiveSort(array, pivotIndex + 1, high, depth - 1); - high = pivotIndex - 1; - } - insertionSort(array, low, high); - } + /** + * Performs introspective sort on the specified subarray. + * + * @param array The array to be sorted + * @param low The starting index of the subarray + * @param high The ending index of the subarray + * @param depth The current depth of recursion + * @param The type of elements in the array, which must be comparable + */ + private static > void introspectiveSort(T[] array, final int low, int high, + final int depth) { + while (high - low > INSERTION_SORT_THRESHOLD) { + if (depth == 0) { + heapSort(array, low, high); + return; + } + final int pivotIndex = partition(array, low, high); + introspectiveSort(array, pivotIndex + 1, high, depth - 1); + high = pivotIndex - 1; + } + insertionSort(array, low, high); + } - /** - * Partitions the array around a pivot. - * - * @param array The array to be partitioned - * @param low The starting index of the subarray - * @param high The ending index of the subarray - * @param The type of elements in the array, which must be comparable - * @return The index of the pivot - */ - private static > int partition(T[] array, final int low, final int high) { - final int pivotIndex = low + (int) (Math.random() * (high - low + 1)); - SortUtils.swap(array, pivotIndex, high); - final T pivot = array[high]; - int i = low - 1; - for (int j = low; j < high; j++) { - if(SortUtils.greaterOrEqual(pivot, array[j])) { - i++; - SortUtils.swap(array, i, j); - } - } - SortUtils.swap(array, i + 1, high); - return i + 1; - } + /** + * Partitions the array around a pivot. + * + * @param array The array to be partitioned + * @param low The starting index of the subarray + * @param high The ending index of the subarray + * @param The type of elements in the array, which must be comparable + * @return The index of the pivot + */ + private static > int partition(T[] array, final int low, final int high) { + final int pivotIndex = low + (int) (Math.random() * (high - low + 1)); + SortUtils.swap(array, pivotIndex, high); + final T pivot = array[high]; + int i = low - 1; + for (int j = low; j < high; j++) { + if (SortUtils.greaterOrEqual(pivot, array[j])) { + i++; + SortUtils.swap(array, i, j); + } + } + SortUtils.swap(array, i + 1, high); + return i + 1; + } - /** - * Sorts a subarray using insertion sort. - * - * @param array The array to be sorted - * @param low The starting index of the subarray - * @param high The ending index of the subarray - * @param The type of elements in the array, which must be comparable - */ - private static > void insertionSort(T[] array, final int low, final int high) { - for (int i = low + 1; i <= high; i++) { - final T key = array[i]; - int j = i - 1; - while (j >= low && SortUtils.greater(array[j],key)) { - array[j + 1] = array[j]; - j--; - } - array[j + 1] = key; - } - } + /** + * Sorts a subarray using insertion sort. + * + * @param array The array to be sorted + * @param low The starting index of the subarray + * @param high The ending index of the subarray + * @param The type of elements in the array, which must be comparable + */ + private static > void insertionSort(T[] array, final int low, final int high) { + for (int i = low + 1; i <= high; i++) { + final T key = array[i]; + int j = i - 1; + while (j >= low && SortUtils.greater(array[j], key)) { + array[j + 1] = array[j]; + j--; + } + array[j + 1] = key; + } + } - /** - * Sorts a subarray using heapsort. - * - * @param array The array to be sorted - * @param low The starting index of the subarray - * @param high The ending index of the subarray - * @param The type of elements in the array, which must be comparable - */ - private static > void heapSort(T[] array, final int low, final int high) { - final int n = high - low + 1; - for (int i = (n / 2) - 1; i >= 0; i--) { - heapify(array, i, n, low); - } - for (int i = high; i > low; i--) { - SortUtils.swap(array, low, i); - heapify(array, 0, i - low, low); - } - } + /** + * Sorts a subarray using heapsort. + * + * @param array The array to be sorted + * @param low The starting index of the subarray + * @param high The ending index of the subarray + * @param The type of elements in the array, which must be comparable + */ + private static > void heapSort(T[] array, final int low, final int high) { + final int n = high - low + 1; + for (int i = (n / 2) - 1; i >= 0; i--) { + heapify(array, i, n, low); + } + for (int i = high; i > low; i--) { + SortUtils.swap(array, low, i); + heapify(array, 0, i - low, low); + } + } - /** - * Maintains the heap property for a subarray. - * - * @param array The array to be heapified - * @param i The index to be heapified - * @param n The size of the heap - * @param low The starting index of the subarray - * @param The type of elements in the array, which must be comparable - */ - private static > void heapify(T[] array, final int i, final int n, final int low) { - final int left = 2 * i + 1; - final int right = 2 * i + 2; - int largest = i; + /** + * Maintains the heap property for a subarray. + * + * @param array The array to be heapified + * @param i The index to be heapified + * @param n The size of the heap + * @param low The starting index of the subarray + * @param The type of elements in the array, which must be comparable + */ + private static > void heapify(T[] array, final int i, final int n, final int low) { + final int left = 2 * i + 1; + final int right = 2 * i + 2; + int largest = i; - if (left < n && SortUtils.greater(array[low + left],array[low + largest])) { - largest = left; - } - if (right < n && SortUtils.greater(array[low + left],array[low + largest])) { - largest = right; - } - if (largest != i) { - SortUtils.swap(array, low + i, low + largest); - heapify(array, largest, n, low); - } - } + if (left < n && SortUtils.greater(array[low + left], array[low + largest])) { + largest = left; + } + if (right < n && SortUtils.greater(array[low + left], array[low + largest])) { + largest = right; + } + if (largest != i) { + SortUtils.swap(array, low + i, low + largest); + heapify(array, largest, n, low); + } + } } diff --git a/src/main/java/com/thealgorithms/sorts/OddEvenSort.java b/src/main/java/com/thealgorithms/sorts/OddEvenSort.java index bb06edbfa4fe..8f62f1792fe2 100644 --- a/src/main/java/com/thealgorithms/sorts/OddEvenSort.java +++ b/src/main/java/com/thealgorithms/sorts/OddEvenSort.java @@ -1,51 +1,54 @@ package com.thealgorithms.sorts; /** - * OddEvenSort class implements the SortAlgorithm interface using the odd-even sort technique. - * Odd-even sort is a comparison sort related to bubble sort. - * It operates by comparing all (odd, even)-indexed pairs of adjacent elements in the list and, if a pair is in the wrong order, swapping them. - * The next step repeats this process for (even, odd)-indexed pairs. This process continues until the list is sorted. + * OddEvenSort class implements the SortAlgorithm interface using the odd-even + * sort technique. Odd-even sort is a comparison sort related to bubble sort. It + * operates by comparing all (odd, even)-indexed pairs of adjacent elements in + * the list and, if a pair is in the wrong order, swapping them. The next step + * repeats this process for (even, odd)-indexed pairs. This process continues + * until the list is sorted. * */ public final class OddEvenSort implements SortAlgorithm { - /** - * Sorts the given array using the Odd-Even Sort algorithm. - * - * @param the type of elements in the array, which must implement the Comparable interface - * @param array the array to be sorted - * @return the sorted array - */ - @Override - public > T[] sort(T[] array) { - boolean sorted = false; - while (!sorted) { - sorted = performOddSort(array); - sorted = performEvenSort(array) && sorted; - } + /** + * Sorts the given array using the Odd-Even Sort algorithm. + * + * @param the type of elements in the array, which must implement the + * Comparable interface + * @param array the array to be sorted + * @return the sorted array + */ + @Override + public > T[] sort(T[] array) { + boolean sorted = false; + while (!sorted) { + sorted = performOddSort(array); + sorted = performEvenSort(array) && sorted; + } - return array; - } + return array; + } - private > boolean performOddSort(T[] array) { - boolean sorted = true; - for (int i = 1; i < array.length - 1; i += 2) { - if (SortUtils.greater(array[i],array[i + 1])) { - SortUtils.swap(array, i, i + 1); - sorted = false; - } - } - return sorted; - } + private > boolean performOddSort(T[] array) { + boolean sorted = true; + for (int i = 1; i < array.length - 1; i += 2) { + if (SortUtils.greater(array[i], array[i + 1])) { + SortUtils.swap(array, i, i + 1); + sorted = false; + } + } + return sorted; + } - private > boolean performEvenSort(T[] array) { - boolean sorted = true; - for (int i = 0; i < array.length - 1; i += 2) { - if (SortUtils.greater(array[i],array[i + 1])) { - SortUtils.swap(array, i, i + 1); - sorted = false; - } - } - return sorted; - } + private > boolean performEvenSort(T[] array) { + boolean sorted = true; + for (int i = 0; i < array.length - 1; i += 2) { + if (SortUtils.greater(array[i], array[i + 1])) { + SortUtils.swap(array, i, i + 1); + sorted = false; + } + } + return sorted; + } } diff --git a/src/main/java/com/thealgorithms/sorts/SelectionSort.java b/src/main/java/com/thealgorithms/sorts/SelectionSort.java index 2c3a8321e984..0722e8350e77 100644 --- a/src/main/java/com/thealgorithms/sorts/SelectionSort.java +++ b/src/main/java/com/thealgorithms/sorts/SelectionSort.java @@ -1,30 +1,31 @@ package com.thealgorithms.sorts; public class SelectionSort implements SortAlgorithm { - /** - * Sorts an array of comparable elements in increasing order using the selection sort algorithm. - * - * @param array the array to be sorted - * @param the class of array elements - * @return the sorted array - */ - @Override - public > T[] sort(T[] array) { + /** + * Sorts an array of comparable elements in increasing order using the selection + * sort algorithm. + * + * @param array the array to be sorted + * @param the class of array elements + * @return the sorted array + */ + @Override + public > T[] sort(T[] array) { - for (int i = 0; i < array.length - 1; i++) { - final int minIndex = findIndexOfMin(array, i); - SortUtils.swap(array, i, minIndex); - } - return array; - } + for (int i = 0; i < array.length - 1; i++) { + final int minIndex = findIndexOfMin(array, i); + SortUtils.swap(array, i, minIndex); + } + return array; + } - private static > int findIndexOfMin(T[] array, final int startIndex) { - int minIndex = startIndex; - for (int i = startIndex + 1; i < array.length; i++) { - if (SortUtils.less(array[i],array[minIndex])) { - minIndex = i; - } - } - return minIndex; - } + private static > int findIndexOfMin(T[] array, final int startIndex) { + int minIndex = startIndex; + for (int i = startIndex + 1; i < array.length; i++) { + if (SortUtils.less(array[i], array[minIndex])) { + minIndex = i; + } + } + return minIndex; + } } diff --git a/src/main/java/com/thealgorithms/sorts/SelectionSortRecursive.java b/src/main/java/com/thealgorithms/sorts/SelectionSortRecursive.java index 2814a64401d3..d5cfdd37eca3 100644 --- a/src/main/java/com/thealgorithms/sorts/SelectionSortRecursive.java +++ b/src/main/java/com/thealgorithms/sorts/SelectionSortRecursive.java @@ -5,57 +5,59 @@ */ public class SelectionSortRecursive implements SortAlgorithm { - /** - * Sorts an array using recursive selection sort. - * - * @param array the array to be sorted - * @param the type of elements in the array (must be Comparable) - * @return the sorted array - */ - public > T[] sort(T[] array) { - if (array.length == 0) { - return array; - } - recursiveSelectionSort(array, 0); - return array; - } - - /** - * Recursively sorts the array using selection sort. - * - * @param array the array to be sorted - * @param index the current index to start sorting from - * @param the type of elements in the array (must be Comparable) - */ - private static > void recursiveSelectionSort(T[] array, final int index) { - if (index == array.length - 1) { - return; - } - - SortUtils.swap(array, index, findMinIndex(array, index)); - - // Recursively call selection sort for the remaining array - recursiveSelectionSort(array, index + 1); - } - - /** - * Finds the index of the minimum element in the array starting from the given index. - * - * @param array the array to search - * @param start the starting index for the search - * @param the type of elements in the array - * @return the index of the minimum element - */ - private static > int findMinIndex(T[] array, final int start) { - // Base case: if start is the last index, return start - if (start == array.length - 1) { - return start; - } - - // Recursive call to find the minimum index in the rest of the array - final int minIndexInRest = findMinIndex(array, start + 1); - - // Return the index of the smaller element between array[start] and the minimum element in the rest of the array - return SortUtils.less(array[start],array[minIndexInRest]) ? start : minIndexInRest; - } + /** + * Sorts an array using recursive selection sort. + * + * @param array the array to be sorted + * @param the type of elements in the array (must be Comparable) + * @return the sorted array + */ + public > T[] sort(T[] array) { + if (array.length == 0) { + return array; + } + recursiveSelectionSort(array, 0); + return array; + } + + /** + * Recursively sorts the array using selection sort. + * + * @param array the array to be sorted + * @param index the current index to start sorting from + * @param the type of elements in the array (must be Comparable) + */ + private static > void recursiveSelectionSort(T[] array, final int index) { + if (index == array.length - 1) { + return; + } + + SortUtils.swap(array, index, findMinIndex(array, index)); + + // Recursively call selection sort for the remaining array + recursiveSelectionSort(array, index + 1); + } + + /** + * Finds the index of the minimum element in the array starting from the given + * index. + * + * @param array the array to search + * @param start the starting index for the search + * @param the type of elements in the array + * @return the index of the minimum element + */ + private static > int findMinIndex(T[] array, final int start) { + // Base case: if start is the last index, return start + if (start == array.length - 1) { + return start; + } + + // Recursive call to find the minimum index in the rest of the array + final int minIndexInRest = findMinIndex(array, start + 1); + + // Return the index of the smaller element between array[start] and the minimum + // element in the rest of the array + return SortUtils.less(array[start], array[minIndexInRest]) ? start : minIndexInRest; + } } diff --git a/src/main/java/com/thealgorithms/sorts/StalinSort.java b/src/main/java/com/thealgorithms/sorts/StalinSort.java index 6d55ae72abe1..bd086dc996e8 100644 --- a/src/main/java/com/thealgorithms/sorts/StalinSort.java +++ b/src/main/java/com/thealgorithms/sorts/StalinSort.java @@ -1,21 +1,21 @@ package com.thealgorithms.sorts; public class StalinSort implements SortAlgorithm { - @SuppressWarnings("unchecked") - public > T[] sort(T[] array) { - if (array.length == 0) { - return array; - } - int currentIndex = 0; - for (int i = 1; i < array.length; i++) { - if (SortUtils.greaterOrEqual(array[i],array[currentIndex])) { - currentIndex++; - array[currentIndex] = array[i]; - } - } - // Create a result array with sorted elements - T[] result = (T[]) java.lang.reflect.Array.newInstance(array.getClass().getComponentType(), currentIndex + 1); - System.arraycopy(array, 0, result, 0, currentIndex + 1); - return result; - } + @SuppressWarnings("unchecked") + public > T[] sort(T[] array) { + if (array.length == 0) { + return array; + } + int currentIndex = 0; + for (int i = 1; i < array.length; i++) { + if (SortUtils.greaterOrEqual(array[i], array[currentIndex])) { + currentIndex++; + array[currentIndex] = array[i]; + } + } + // Create a result array with sorted elements + T[] result = (T[]) java.lang.reflect.Array.newInstance(array.getClass().getComponentType(), currentIndex + 1); + System.arraycopy(array, 0, result, 0, currentIndex + 1); + return result; + } } pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy