public class ThreadedMerge extends Thread{
public int[] list;
int start, end;
static int num = 0;
public ThreadedMerge(int[] array, int pStart, int pEnd){
list = array;
start = pStart; end = pEnd;
}
public void run(){
list = mergeSort(list, start, end);
}
/**
* Merges two sorted int array into one new sorted array.
* @param lhs
* @param rhs
* @return
*/
private static int[] merge(int[] lhs, int[] rhs) {
int[] result = new int[lhs.length + rhs.length];
int leftIndex = 0;
int rightIndex = 0;
while(leftIndex < lhs.length && rightIndex < rhs.length) {
if(lhs[leftIndex] <= rhs[rightIndex]) {
result[leftIndex + rightIndex] = lhs[leftIndex];
leftIndex++;
} else {
result[leftIndex + rightIndex] = rhs[rightIndex];
rightIndex++;
}
}
while(leftIndex < lhs.length) {
result[leftIndex + rightIndex] = lhs[leftIndex];
leftIndex++;
}
while(rightIndex < rhs.length) {
result[leftIndex + rightIndex] = rhs[rightIndex];
rightIndex++;
}
return result;
}
/**
* Sorts an array from index startIndex
(inclusive) to endIndex
(exclusive).
* @param array
* @param startIndex
* @param endIndex
* @return new array that is sorted
*/
private static int[] mergeSort(int[] array, int startIndex, int endIndex) {
int length = endIndex - startIndex;
if(length == 0) {
return new int[]{};
}
if(length == 1) {
return new int[]{array[startIndex]};
}
Runtime runtime = Runtime.getRuntime();
int nrOfProcessors = runtime.availableProcessors();
int[] sortedLeftPart = null;
int[] sortedRightPart = null;
int halfLength = length / 2;
if(num <= nrOfProcessors){
num += 2;
ThreadedMerge tm1 = new ThreadedMerge(array, startIndex, startIndex + halfLength);
ThreadedMerge tm2 = new ThreadedMerge(array, startIndex + halfLength, endIndex);
tm1.start(); tm2.start();
try{
tm1.join(); tm2.join();
sortedLeftPart = tm1.list;
sortedRightPart = tm2.list;
}catch(InterruptedException e){
}
}else{
sortedLeftPart = mergeSort(array, startIndex, startIndex + halfLength);
sortedRightPart = mergeSort(array, startIndex + halfLength, endIndex);
}
return merge(sortedLeftPart, sortedRightPart);
}
}