package  csdn. dreamzuora. sort; import  java. util. List; 
public  abstract  class  Sort < E> { public  void  sort ( List< E> ) { } ; public  void  sort ( List< E> ,  int  left,  int  right) { } ; } package  csdn. dreamzuora. sort; import  java. util. ArrayList; 
import  java. util. List; 
public  class  CountSort  extends  Sort < Integer> { @Override public  void  sort ( List< Integer> )  { int  size =  array. size ( ) ; Integer max =  array. get ( 0 ) ; Integer min =  array. get ( 0 ) ; for  ( int  i =  1 ;  i <  size;  i++ ) { Integer val =  array. get ( i) ; if  ( max <  val) { max =  val; } if  ( min >  val) { min =  val; } } int  len =  max -  min; int  offset =  min; int  [ ]  tempList =  new  int [ len +  1 ] ; for  ( int  i =  0 ;  i <  size;  i++ ) { Integer val =  array. get ( i)  -  offset; Integer count =  tempList[ val] ; if  ( count ==  null) { count =  0 ; } tempList[ val]  =  ++ count; } int  k =  0 ; for  ( int  i =  0 ;  i <  len;  i++ ) { Integer count =  tempList[ i] ; if  ( count !=  null) { while  ( count !=  0 ) { array. set ( k++ ,  i +  offset) ; count -- ; } } } } 
} package  csdn. dreamzuora. sort; import  org. junit. Test; 
import  org. junit. jupiter. api. Assertions; import  java. util. Arrays; 
import  java. util. List; import  static  org. junit. Assert. *; 
public  class  CountSortTest  { @Test public  void  sort ( )  { CountSort countSort =  new  CountSort ( ) ; List< Integer> =  Arrays. asList ( 4 ,  8 ,  4 ,  6 ,  2 ,  10 ) ; List< Integer> =  Arrays. asList ( 2 ,  4 ,  4 ,  6 ,  8 ,  10 ) ; countSort. sort ( list) ; Assertions. assertEquals ( expectList,  list) ; } 
} 
package  csdn. dreamzuora. sort; import  java. util. ArrayList; 
import  java. util. Collections; 
import  java. util. LinkedList; 
import  java. util. List; 
public  class  BucketSort  extends  Sort < Integer> { @Override public  void  sort ( List< Integer> )  { if  ( array ==  null ||  array. isEmpty ( ) ) { return ; } int  max =  array. get ( 0 ) ; int  min =  array. get ( 0 ) ; int  size =  array. size ( ) ; for  ( int  i =  0 ;  i <  size;  i++ ) { max =  Math. max ( array. get ( i) ,  max) ; min =  Math. min ( array. get ( i) ,  min) ; } int  offset =  max -  min; int  bucketSize =  ( max -  min)  /  size +  1 ; List< LinkedList< Integer> >  bucketList =  new  ArrayList < > ( bucketSize) ; for  ( int  i =  0 ;  i <  bucketSize;  i++ ) { bucketList. add ( new  LinkedList < > ( ) ) ; } for  ( int  i=  0 ;  i <  size;  i++ ) { int  val =  array. get ( i) ; int  num =  ( array. get ( i)  -  min)  *  ( bucketSize -  1 )  /  offset; bucketList. get ( num) . add ( val) ; } List< Integer> =  new  ArrayList < > ( ) ; for  ( int  i =  0 ;  i <  bucketSize;  i++ ) { Collections. sort ( bucketList. get ( i) ) ; } int  index =  0 ; for  ( LinkedList< Integer> :  bucketList) { for  ( Integer val :  itemList) { sortList. set ( index++  ,  val) ; } } } 
} package  csdn. dreamzuora. sort; import  org. junit. Test; 
import  org. junit. jupiter. api. Assertions; import  java. util. *; import  static  org. junit. Assert. *; 
public  class  BucketSortTest  { BubbleSort bubbleSort =  new  BubbleSort ( ) ; @Test public  void  sort ( )  { List< Integer> =  Arrays. asList ( 4 ,  8 ,  4 ,  6 ,  2 ,  10 ) ; List< Integer> =  Arrays. asList ( 2 ,  4 ,  4 ,  6 ,  8 ,  10 ) ; bubbleSort. sort ( list) ; Assertions. assertEquals ( expectList,  list) ; } @Test public  void  sort2 ( )  { Random random =  new  Random ( ) ; List< Integer> =  Arrays. asList ( random. nextInt ( 100 ) ,  random. nextInt ( 100 ) ,  random. nextInt ( 100 ) ,  random. nextInt ( 100 ) ,  random. nextInt ( 100 ) ,  random. nextInt ( 100 ) ) ; List< Integer> =  new  ArrayList < > ( actuallyList) ; Collections. sort ( expectList) ; bubbleSort. sort ( actuallyList) ; Assertions. assertEquals ( expectList,  actuallyList) ; } 
}