Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Latest commit

 

History

History
History
97 lines (77 loc) · 3.1 KB

File metadata and controls

97 lines (77 loc) · 3.1 KB
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
package Sorts;
import java.util.*;
import java.util.stream.IntStream;
import java.util.stream.Stream;
import static java.util.stream.Collectors.toList;
import static java.util.stream.Collectors.toMap;
import static Sorts.SortUtils.print;
/**
* @author Youssef Ali (https://github.com/youssefAli11997)
* @author Podshivalov Nikita (https://github.com/nikitap492)
*/
class CountingSort implements SortAlgorithm {
@Override
public <T extends Comparable<T>> T[] sort(T[] unsorted) {
return sort(Arrays.asList(unsorted)).toArray(unsorted);
}
/**
* This method implements the Generic Counting Sort
*
* @param list The list to be sorted
* <p>
* Sorts the list in increasing order
* The method uses list elements as keys in the frequency map
**/
@Override
public <T extends Comparable<T>> List<T> sort(List<T> list) {
Map<T, Integer> frequency = new TreeMap<>();
// The final output array
List<T> 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<T, Integer> element : frequency.entrySet()) {
for (int j = 0; j < element.getValue(); j++) {
sortedArray.add(element.getKey());
}
}
return sortedArray;
}
/**
* Stream Counting Sort
* The same as method {@link CountingSort#sort(List)} } but this method uses stream API
*
* @param list The list to be sorted
**/
private static <T extends Comparable<T>> List<T> streamSort(List<T> 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
List<Integer> unsortedInts = Stream.of(4, 23, 6, 78, 1, 54, 23, 1, 9, 231, 9, 12).collect(toList());
CountingSort countingSort = new CountingSort();
System.out.println("Before Sorting:");
print(unsortedInts);
// Output => 1 1 4 6 9 9 12 23 23 54 78 231
System.out.println("After Sorting:");
print(countingSort.sort(unsortedInts));
System.out.println("After Sorting By Streams:");
print(streamSort(unsortedInts));
System.out.println("\n------------------------------\n");
// String Input
List<String> unsortedStrings = Stream.of("c", "a", "e", "b", "d", "a", "f", "g", "c").collect(toList());
System.out.println("Before Sorting:");
print(unsortedStrings);
//Output => a a b c c d e f g
System.out.println("After Sorting:");
print(countingSort.sort(unsortedStrings));
System.out.println("After Sorting By Streams:");
print(streamSort(unsortedStrings));
}
}
Morty Proxy This is a proxified and sanitized view of the page, visit original site.