|
1 | 1 | package com.thealgorithms.sorts;
|
2 | 2 |
|
3 |
| -import java.util.Iterator; |
4 |
| -import java.util.LinkedList; |
| 3 | +import java.util.ArrayList; |
| 4 | +import java.util.Arrays; |
| 5 | +import java.util.List; |
5 | 6 |
|
6 |
| -public final class StrandSort { |
7 |
| - private StrandSort() { |
| 7 | +/** |
| 8 | + * StrandSort class implementing the SortAlgorithm interface using arrays. |
| 9 | + */ |
| 10 | +public final class StrandSort implements SortAlgorithm { |
| 11 | + |
| 12 | + /** |
| 13 | + * Sorts the given array using the Strand Sort algorithm. |
| 14 | + * |
| 15 | + * @param <T> The type of elements to be sorted, must be Comparable. |
| 16 | + * @param unsorted The array to be sorted. |
| 17 | + * @return The sorted array. |
| 18 | + */ |
| 19 | + @Override |
| 20 | + public <T extends Comparable<T>> T[] sort(T[] unsorted) { |
| 21 | + List<T> unsortedList = new ArrayList<>(Arrays.asList(unsorted)); |
| 22 | + List<T> sortedList = strandSort(unsortedList); |
| 23 | + return sortedList.toArray(unsorted); |
8 | 24 | }
|
9 | 25 |
|
10 |
| - // note: the input list is destroyed |
11 |
| - public static <E extends Comparable<? super E>> LinkedList<E> strandSort(LinkedList<E> list) { |
| 26 | + /** |
| 27 | + * Strand Sort algorithm that sorts a list. |
| 28 | + * |
| 29 | + * @param <T> The type of elements to be sorted, must be Comparable. |
| 30 | + * @param list The list to be sorted. |
| 31 | + * @return The sorted list. |
| 32 | + */ |
| 33 | + private static <T extends Comparable<? super T>> List<T> strandSort(List<T> list) { |
12 | 34 | if (list.size() <= 1) {
|
13 | 35 | return list;
|
14 | 36 | }
|
15 | 37 |
|
16 |
| - LinkedList<E> result = new LinkedList<E>(); |
17 |
| - while (list.size() > 0) { |
18 |
| - LinkedList<E> sorted = new LinkedList<E>(); |
19 |
| - sorted.add(list.removeFirst()); // same as remove() or remove(0) |
20 |
| - for (Iterator<E> it = list.iterator(); it.hasNext();) { |
21 |
| - E elem = it.next(); |
22 |
| - if (sorted.peekLast().compareTo(elem) <= 0) { |
23 |
| - sorted.addLast(elem); // same as add(elem) or add(0, elem) |
24 |
| - it.remove(); |
| 38 | + List<T> result = new ArrayList<>(); |
| 39 | + while (!list.isEmpty()) { |
| 40 | + final List<T> sorted = new ArrayList<>(); |
| 41 | + sorted.add(list.remove(0)); |
| 42 | + for (int i = 0; i < list.size();) { |
| 43 | + if (sorted.get(sorted.size() - 1).compareTo(list.get(i)) <= 0) { |
| 44 | + sorted.add(list.remove(i)); |
| 45 | + } else { |
| 46 | + i++; |
25 | 47 | }
|
26 | 48 | }
|
27 |
| - result = merge(sorted, result); |
| 49 | + result = merge(result, sorted); |
28 | 50 | }
|
29 | 51 | return result;
|
30 | 52 | }
|
31 | 53 |
|
32 |
| - private static <E extends Comparable<? super E>> LinkedList<E> merge(LinkedList<E> left, LinkedList<E> right) { |
33 |
| - LinkedList<E> result = new LinkedList<E>(); |
34 |
| - while (!left.isEmpty() && !right.isEmpty()) { |
35 |
| - // change the direction of this comparison to change the direction of the sort |
36 |
| - if (left.peek().compareTo(right.peek()) <= 0) { |
37 |
| - result.add(left.remove()); |
| 54 | + /** |
| 55 | + * Merges two sorted lists into one sorted list. |
| 56 | + * |
| 57 | + * @param <T> The type of elements to be sorted, must be Comparable. |
| 58 | + * @param left The first sorted list. |
| 59 | + * @param right The second sorted list. |
| 60 | + * @return The merged sorted list. |
| 61 | + */ |
| 62 | + private static <T extends Comparable<? super T>> List<T> merge(List<T> left, List<T> right) { |
| 63 | + List<T> result = new ArrayList<>(); |
| 64 | + int i = 0; |
| 65 | + int j = 0; |
| 66 | + while (i < left.size() && j < right.size()) { |
| 67 | + if (left.get(i).compareTo(right.get(j)) <= 0) { |
| 68 | + result.add(left.get(i)); |
| 69 | + i++; |
38 | 70 | } else {
|
39 |
| - result.add(right.remove()); |
| 71 | + result.add(right.get(j)); |
| 72 | + j++; |
40 | 73 | }
|
41 | 74 | }
|
42 |
| - result.addAll(left); |
43 |
| - result.addAll(right); |
| 75 | + result.addAll(left.subList(i, left.size())); |
| 76 | + result.addAll(right.subList(j, right.size())); |
44 | 77 | return result;
|
45 | 78 | }
|
46 | 79 | }
|
0 commit comments