22
33import java .util .ArrayList ;
44import java .util .Comparator ;
5+ import java .util .LinkedList ;
56import java .util .List ;
67
78public class IntegerBucketSorter implements Sorter <Integer > {
@@ -28,43 +29,40 @@ public List<Integer> sort(List<Integer> arrayToSort) {
2829 }
2930
3031 private List <Integer > concatenateSortedBuckets (List <List <Integer >> buckets ){
31- List <Integer > sortedArray = new ArrayList <>();
32- int index = 0 ;
32+ List <Integer > sortedArray = new LinkedList <>();
3333 for (List <Integer > bucket : buckets ){
34- for (int number : bucket ){
35- sortedArray .add (index ++, number );
36- }
34+ sortedArray .addAll (bucket );
3735 }
3836 return sortedArray ;
3937 }
4038
4139 private List <List <Integer >> splitIntoUnsortedBuckets (List <Integer > initialList ){
4240
43- final int [] codes = createHashes (initialList );
41+ final int max = findMax (initialList );
42+ final int numberOfBuckets = (int ) Math .sqrt (initialList .size ());
4443
45- List <List <Integer >> buckets = new ArrayList <>(codes [ 1 ] );
46- for (int i = 0 ; i < codes [ 1 ] ; i ++) buckets .add (new ArrayList <>());
44+ List <List <Integer >> buckets = new ArrayList <>();
45+ for (int i = 0 ; i < numberOfBuckets ; i ++) buckets .add (new ArrayList <>());
4746
4847 //distribute the data
4948 for (int i : initialList ) {
50- buckets .get (hash (i , codes )).add (i );
49+ buckets .get (hash (i , max , numberOfBuckets )).add (i );
5150 }
5251 return buckets ;
5352
5453 }
5554
56- private int [] createHashes (List <Integer > input ){
57- int m = input .get (0 );
58- for (int i = 1 ; i < input .size (); i ++) {
59- if (m < input .get (i )) {
60- m = input .get (i );
61- }
55+ private int findMax (List <Integer > input ){
56+ int m = Integer .MIN_VALUE ;
57+ for (int i : input ){
58+ m = Math .max (i , m );
6259 }
63- return new int []{ m , ( int ) Math . sqrt ( input . size ())} ;
60+ return m ;
6461 }
6562
66- private static int hash (int i , int [] code ) {
67- return (int ) ((double ) i / code [ 0 ] * (code [ 1 ] - 1 ));
63+ private static int hash (int i , int max , int numberOfBuckets ) {
64+ return (int ) ((double ) i / max * (numberOfBuckets - 1 ));
6865 }
6966
67+
7068}
0 commit comments