/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package moreTests;
import java.util.Arrays;
/**
*
* @author shayzukerman
*/
public class MergeSortByThreads implements ThreadWorkerClient
{
int[] inpArr;
int N; // Size of the input array
int[] tmpArr; //Helper array
ThreadWorkersManager threadsManager;
public MergeSortByThreads(int[] inpArr)
{
this.inpArr = inpArr;
N = inpArr.length;
tmpArr = new int[N];
threadsManager = new ThreadWorkersManager(this, 2);
}
public void mergeSort()
{
//mergeSort_aux(0, N - 1, 0);
int min = 0;
int max = N - 1;
int mid = min + (max - min) / 2;
threadsManager.addWorkerThread(min, mid, true);
threadsManager.addWorkerThread(mid + 1, max, true);
}
private void mergeSort_aux(int min, int max, int dbg_level)
{
printRange
(min, max,
String.
format("start - level: %d ", dbg_level
));
if (min >= max)
return;
int mid = min + (max - min) / 2;
mergeSort_aux(min, mid, dbg_level + 1);
mergeSort_aux(mid + 1, max, dbg_level + 1);
sortParts(min, mid, max);
}
private void sortParts(int min, int mid, int max)
{
int i = min;
int j = mid + 1;
int k = 0;
System.
out.
println("mid: " + mid
);
printRange(min, max, "In sortParts - start");
while (i <= mid && j <= max)
{
if (inpArr[i] < inpArr[j])
{
tmpArr[k++] = inpArr[i];
i++;
}
else
{
tmpArr[k++] = inpArr[j];
j++;
}
}
while (i <= mid)
tmpArr[k++] = inpArr[i++];
while (j <= max)
tmpArr[k++] = inpArr[j++];
System.
arraycopy(tmpArr,
0, inpArr, min, max
- min
+ 1);
printRange(min, max, "In sortParts - end");
}
private void printRange
(int min,
int max,
String msg
)
{
System.
out.
format("%s - min: %d max: %d - [", msg, min, max
);
while (min <= max)
{
System.
out.
format("%d%s", inpArr
[min
],
((min
< max
) ? ", " : ""));
min++;
}
}
@Override
public int[] getArray()
{
return(this.inpArr);
}
@Override
public void handleArray(int min, int max)
{
mergeSort_aux(min, max, 0);
}
@Override
public void notifyReady()
{
System.
out.
println("Sort Merge threads are complete");
int min = 0;
int max = N - 1;
int mid = min + (N - 1 - min) / 2;
sortParts(min, mid, max);
printRange(0, inpArr.length - 1, "After sort");
}
public static void main
(String[] args
)
{
int[] inpArr = {8, 294, 20, 2,96, 1,6,3,9,4,1000, 5,10, 123};
//int[] inpArr = {3, 2, 4, 1};
MergeSortByThreads ms = new MergeSortByThreads(inpArr);
ms.mergeSort();
}
}