diff --git a/Sorts/CountingSort.java b/Sorts/CountingSort.java index e6828265..b0b5e7aa 100644 --- a/Sorts/CountingSort.java +++ b/Sorts/CountingSort.java @@ -1,10 +1,17 @@ import java.util.ArrayList; +import java.util.List; import java.util.Map; import java.util.TreeMap; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +import static java.util.stream.Collectors.toList; +import static java.util.stream.Collectors.toMap; /** * * @author Youssef Ali (https://github.com/youssefAli11997) + * @author Podshivalov Nikita (https://github.com/nikitap492) * */ @@ -13,78 +20,87 @@ class CountingSort { /** * This method implements the Generic Counting Sort * - * @param array The array to be sorted - * @param last The count of total number of elements in array - * Sorts the array in increasing order - * It uses array elements as keys in the frequency map + * @param list The list to be sorted + * + * Sorts the list in increasing order + * The method uses list elements as keys in the frequency map **/ - - public static > void CS(T[] array, int last) { - - Map frequency = new TreeMap(); - // The final output array - ArrayList sortedArray = new ArrayList(); - - // Counting the frequency of @param array elements - for(T t : array) { - try{ - frequency.put(t, frequency.get(t)+1); - }catch(Exception e){ // new entry - frequency.put(t, 1); - } - } - - // Filling the sortedArray - for(Map.Entry element : frequency.entrySet()) { + public static > List CS(List list) { + + Map frequency = new TreeMap<>(); + // The final output array + List sortedArray = new ArrayList<>(list.size()); + + // Counting the frequency of @param array elements + list.forEach(v -> frequency.put(v, frequency.getOrDefault(v, 0) + 1)); + + // Filling the sortedArray + for(Map.Entry element : frequency.entrySet()) { for(int j=0; j> List streamCS(List list) { + return list.stream() + .collect(toMap(k -> k, v -> 1, (v1, v2) -> v1 + v2, TreeMap::new)) + .entrySet() + .stream() + .flatMap(entry -> IntStream.rangeClosed(1, entry.getValue()).mapToObj(t -> entry.getKey())) + .collect(toList()); } // Driver Program public static void main(String[] args) { // Integer Input - Integer[] arr1 = {4,23,6,78,1,54,231,9,12}; - int last = arr1.length; - + List unsortedInts = Stream.of(4, 23, 6, 78, 1, 54, 23, 1, 9, 231, 9, 12).collect(toList()); + System.out.println("Before Sorting:"); - for (int i=0;i 1 4 6 9 12 23 54 78 231 + // Output => 1 1 4 6 9 9 12 23 23 54 78 231 System.out.println("After Sorting:"); - for (int i=0;i unsortedStrings = Stream.of("c", "a", "e", "b","d", "a", "f", "g", "c").collect(toList()); + System.out.println("Before Sorting:"); - for (int i=0;i a b c d e + //Output => a a b c c d e f g System.out.println("After Sorting:"); - for(int i=0; i toPrint){ + toPrint.stream() + .map(Object::toString) + .map(str -> str + " ") + .forEach(System.out::print); + + System.out.println(); } }