package  csdn. dreamzuora. sort; import  java. util. List; 
public  abstract  class  Sort < E> { public  void  sort ( List< E> ) { if  ( array ==  null ||  array. isEmpty ( ) ) { return ; } } ; public  void  sort ( List< E> ,  int  left,  int  right) { } ; } package  csdn. dreamzuora. sort; import  java. util. List; 
public  class  HeapSort  extends  Sort < Integer> { @Override public  void  sort ( List< Integer> )  { for ( int  size =  array. size ( ) ,  i =  size /  2  -  1 ;  i >=  0 ;  i-- ) { adjustHeap ( array,  i,  size) ; } for  ( int  j =  array. size ( )  -  1 ;  j >  0 ;  j-- ) { swap ( array,  0 ,  j) ; adjustHeap ( array,  0 ,  j) ; } } public  void  adjustHeap ( List< Integer> ,  int  i,  int  length) { int  temp =  arr. get ( i) ; for ( int  k =  i* 2  +  1 ;  k <  length;  k =  k* 2  +  1 ) { if ( k+ 1  <  length &&  arr. get ( k)  <  arr. get ( k+ 1 ) ) { k++ ; } if ( arr. get ( k)  >  temp) { arr. set ( i,  arr. get ( k) )  ; i =  k; } else { break ; } } arr. set ( i,  temp) ; } private  void  swap ( List< Integer> ,  int  a,  int  b) { int  temp =  arr. get ( a) ; arr. set ( a,  arr. get ( b) ) ; arr. set ( b,  temp) ; } 
} 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  HeapSortTest  { @Test public  void  sort ( )  { HeapSort heapSort =  new  HeapSort ( ) ; List< Integer> =  Arrays. asList ( 4 ,  5 ,  2 ,  6 ) ; heapSort. sort ( list) ; Assertions. assertEquals ( Arrays. asList ( 2 ,  4 ,  5 ,  6 ) ,  list) ; } 
} 
package  csdn. dreamzuora. sort; import  java. util. ArrayList; 
import  java. util. List; 
public  class  MergeSort  extends  Sort < Integer> { @Override public  void  sort ( List< Integer> )  { if  ( a ==  null ||  a. isEmpty ( ) ) { return ; } List< Integer> =  new  ArrayList < > ( ) ; for  ( int  i =  0 ;  i <  a. size ( ) ;  i++ ) { b. add ( 0 ) ; } merge ( a,  b, 0 ,  a. size ( ) ) ; for  ( int  i =  0 ;  i <  b. size ( ) ;  i++ ) { a. set ( i,  b. get ( i) ) ; } } private  void  merge ( List< Integer> ,  List< Integer> ,  int  start,  int  end) { if  ( end -  start <=  1 ) { return ; } int  mid =  ( start +  end) / 2 ; int  left =  start; int  right =  mid; int  index =  start; merge ( a,  b,  start,  mid) ; merge ( a,  b,  mid,  end) ; while  ( left <  mid ||  right <  end) { if  ( right >=  end) { b. set ( index ++ ,  a. get ( left ++ ) ) ; } else  if  ( left <  mid &&  a. get ( left)  <  a. get ( right) ) { b. set ( index ++ ,  a. get ( left ++ ) ) ; } else  { b. set ( index ++ ,  a. get ( right ++ ) ) ; } } for  ( int  i =  start;  i <  index;  i++ ) { a. set ( i,  b. get ( i) ) ; } } } package  csdn. dreamzuora. sort; import  org. junit. Test; 
import  org. junit. jupiter. api. Assertions; import  java. util. *; import  static  org. junit. Assert. *; 
public  class  MergeSortTest  { @Test public  void  sort ( )  { MergeSort mergeSort =  new  MergeSort ( ) ; 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) ; mergeSort. sort ( actuallyList) ; Assertions. assertEquals ( expectList,  actuallyList) ; } 
}