分治排序
public class DivideSort {
public static void divide ( int [ ] arr, int start, int split, int end) {
System . out. printf ( "分解:" ) ;
for ( int i = start; i <= end; i++ ) {
if ( i == split) {
System . out. printf ( "(%d)\t" , arr[ i] ) ;
} else {
System . out. printf ( "%d\t" , arr[ i] ) ;
}
}
System . out. println ( ) ;
if ( split - start > 1 ) {
divide ( arr, start, ( start + split) / 2 , split) ;
} else {
if ( arr[ start] > arr[ split] ) {
conquer ( arr, start, split) ;
}
}
if ( end - split > 1 ) {
divide ( arr, split, ( end + split) / 2 , end) ;
} else {
if ( arr[ split] > arr[ end] ) {
conquer ( arr, split, end) ;
}
}
combine ( arr, start, split, end) ;
}
public static void conquer ( int [ ] arr, int start, int end) {
System . out. printf ( "start:%d,end:%d\n" , start, end) ;
int temp = arr[ start] ;
arr[ start] = arr[ end] ;
arr[ end] = temp;
for ( int i : arr) {
System . out. printf ( "%d\t" , i) ;
}
System . out. println ( ) ;
System . out. println ( "==================" ) ;
}
public static void combine ( int [ ] arr, int start, int split, int end) {
System . out. printf ( "合并:start:%d,split:%d,end%d\n" , start, split, end) ;
int [ ] temp = new int [ end - start + 1 ] ;
int index = 0 ;
int left = start;
int right = split;
while ( left < split || right <= end) {
if ( left >= split) {
temp[ index] = arr[ right] ;
right++ ;
} else if ( right > end) {
temp[ index] = arr[ left] ;
left++ ;
} else if ( arr[ left] > arr[ right] ) {
temp[ index] = arr[ right] ;
right++ ;
} else {
temp[ index] = arr[ left] ;
left++ ;
}
index++ ;
}
if ( temp. length >= 0 ) {
System . arraycopy ( temp, 0 , arr, start, temp. length) ;
}
System . out. print ( "合并后:\t" ) ;
for ( int i : arr) {
System . out. printf ( "%d\t" , i) ;
}
System . out. println ( ) ;
}
public static void sort ( int [ ] arr) {
divide ( arr, 0 , ( arr. length - 1 ) / 2 , arr. length - 1 ) ;
}
public static void main ( String [ ] args) {
int size = 1000 ;
int linefeed= 100 ;
int [ ] arr = new int [ size] ;
for ( int i = 0 ; i < size; i++ ) {
arr[ i] = ( int ) ( Math . random ( ) * size) ;
}
long startTime = System . currentTimeMillis ( ) ;
System . out. println ( "排序前:" ) ;
for ( int i = 0 ; i < arr. length; i++ ) {
System . out. printf ( "%d\t" , arr[ i] ) ;
if ( ( i + 1 ) % linefeed == 0 ) {
System . out. println ( ) ;
}
}
sort ( arr) ;
long endTime = System . currentTimeMillis ( ) ;
System . out. println ( "排序耗时(毫秒):" + ( endTime - startTime) ) ;
System . out. println ( "排序后:" ) ;
for ( int i = 0 ; i < arr. length; i++ ) {
System . out. printf ( "%d\t" , arr[ i] ) ;
if ( ( i + 1 ) % linefeed == 0 ) {
System . out. println ( ) ;
}
}
}
}