计数排序
java代码实现
package csdn. dreamzuora. sort; import java. util. List;
public abstract class Sort < E> { public void sort ( List< E> array) { } ; public void sort ( List< E> array, 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> array) { 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> list = Arrays. asList ( 4 , 8 , 4 , 6 , 2 , 10 ) ; List< Integer> expectList = Arrays. asList ( 2 , 4 , 4 , 6 , 8 , 10 ) ; countSort. sort ( list) ; Assertions. assertEquals ( expectList, list) ; }
}
桶排序
java代码实现
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> array) { 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> sortList = new ArrayList < > ( ) ; for ( int i = 0 ; i < bucketSize; i++ ) { Collections. sort ( bucketList. get ( i) ) ; } int index = 0 ; for ( LinkedList< Integer> itemList : 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> list = Arrays. asList ( 4 , 8 , 4 , 6 , 2 , 10 ) ; List< Integer> expectList = 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> actuallyList = Arrays. asList ( random. nextInt ( 100 ) , random. nextInt ( 100 ) , random. nextInt ( 100 ) , random. nextInt ( 100 ) , random. nextInt ( 100 ) , random. nextInt ( 100 ) ) ; List< Integer> expectList = new ArrayList < > ( actuallyList) ; Collections. sort ( expectList) ; bubbleSort. sort ( actuallyList) ; Assertions. assertEquals ( expectList, actuallyList) ; }
}