Fundamental Sort
单线程实现归并排序
package com. bob. algorithms. sort;
import java. util. Arrays;
import com. bob. algorithms. SortStrategy;
public class SingleThreadMergeSort implements SortStrategy {
public int [ ] sort ( int [ ] rawArray) {
mergeSort ( rawArray) ;
return rawArray;
}
private void mergeSort ( int [ ] intArr) {
if ( intArr. length > 1 ) {
int [ ] leftArray = Arrays. copyOfRange ( intArr, 0 , intArr. length / 2 ) ;
int [ ] rightArray = Arrays. copyOfRange ( intArr, intArr. length / 2 , intArr. length) ;
mergeSort ( leftArray) ;
mergeSort ( rightArray) ;
merge ( leftArray, rightArray, intArr) ;
}
}
private void merge ( int [ ] leftArray, int [ ] rightArray, int [ ] intArr) {
int i = 0 , j = 0 , k = 0 ;
while ( i < leftArray. length && j < rightArray. length) {
if ( leftArray[ i] < rightArray[ j] ) {
intArr[ k] = leftArray[ i] ;
i++ ;
} else {
intArr[ k] = rightArray[ j] ;
j++ ;
}
k++ ;
}
if ( i == leftArray. length) {
for ( ; j < rightArray. length; j++ , k++ ) {
intArr[ k] = rightArray[ j] ;
}
} else {
for ( ; i < leftArray. length; i++ , k++ ) {
intArr[ k] = leftArray[ i] ;
}
}
}
}
分治算法
package sortdemo;
import java. util. Arrays;
public class MergeSort {
public static void main ( String [ ] args) {
int [ ] arr = { 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 } ;
sort ( arr) ;
System. out. println ( Arrays. toString ( arr) ) ;
}
public static void sort ( int [ ] arr) {
int [ ] temp = new int [ arr. length] ;
sort ( arr, 0 , arr. length- 1 , temp) ;
}
private static void sort ( int [ ] arr, int left, int right, int [ ] temp) {
if ( left< right) {
int mid = ( left+ right) / 2 ;
sort ( arr, left, mid, temp) ;
sort ( arr, mid+ 1 , right, temp) ;
merge ( arr, left, mid, right, temp) ;
}
}
private static void merge ( int [ ] arr, int left, int mid, int right, int [ ] temp) {
int i = left;
int j = mid+ 1 ;
int t = 0 ;
while ( i<= mid && j<= right) {
if ( arr[ i] <= arr[ j] ) {
temp[ t++ ] = arr[ i++ ] ;
} else {
temp[ t++ ] = arr[ j++ ] ;
}
}
while ( i<= mid) {
temp[ t++ ] = arr[ i++ ] ;
}
while ( j<= right) {
temp[ t++ ] = arr[ j++ ] ;
}
t = 0 ;
while ( left <= right) {
arr[ left++ ] = temp[ t++ ] ;
}
}
}