|
|
@@ -4,31 +4,29 @@ class Parallel implements Solver { |
|
|
|
int[] arr; |
|
|
|
int start, end; |
|
|
|
boolean done = false; |
|
|
|
Worker(MultiRadix mr, int[] arr, int start, int end) { |
|
|
|
this.mr = mr; |
|
|
|
this.arr = arr; |
|
|
|
this.start = start; |
|
|
|
this.end = end; |
|
|
|
Worker( int[] arr, int start, int end) { |
|
|
|
this.arr = new int[end - start]; |
|
|
|
int j = 0; |
|
|
|
for (int i = start; i < end; ++i) { |
|
|
|
this.arr[j++] = arr[i]; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
synchronized public void run() { |
|
|
|
arr = mr.radixMulti(arr, start, end); |
|
|
|
arr = new MultiRadix().radixMulti(arr); |
|
|
|
done = true; |
|
|
|
notify(); |
|
|
|
} |
|
|
|
|
|
|
|
synchronized public int[] getSorted() { |
|
|
|
synchronized public void waitFor() { |
|
|
|
while (!done) { |
|
|
|
try { wait(); } catch (InterruptedException ex) {} |
|
|
|
} |
|
|
|
return arr; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public int[] sort(int[] arr) { |
|
|
|
MultiRadix mr = new MultiRadix(); |
|
|
|
|
|
|
|
int n = 4; |
|
|
|
int n = 2; |
|
|
|
int d = arr.length / n; |
|
|
|
|
|
|
|
Worker[] workers = new Worker[n]; |
|
|
@@ -43,28 +41,43 @@ class Parallel implements Solver { |
|
|
|
end = d * (i + 1); |
|
|
|
|
|
|
|
Worker w; Thread t; |
|
|
|
workers[i] = w = new Worker(mr, arr, start, end); |
|
|
|
workers[i] = w = new Worker(arr, start, end); |
|
|
|
threads[i] = t = new Thread(w); |
|
|
|
t.start(); |
|
|
|
} |
|
|
|
|
|
|
|
int[][] arrs = new int[n][]; |
|
|
|
for (int i = 0; i < n; ++i) { |
|
|
|
arrs[i] = workers[i].getSorted(); |
|
|
|
workers[i].waitFor(); |
|
|
|
try { |
|
|
|
threads[i].join(); |
|
|
|
} catch (InterruptedException ex) {} |
|
|
|
} |
|
|
|
|
|
|
|
/* |
|
|
|
Worker w = workers[0]; |
|
|
|
int[] a = arrs[0]; |
|
|
|
for (int i = w.start; i < w.end; ++i) { |
|
|
|
System.out.print(a[i]+" "); |
|
|
|
int[] is = new int[n]; |
|
|
|
for (int i = 0; i < n; ++i) |
|
|
|
is[i] = 0; |
|
|
|
|
|
|
|
for (int i = 0; i < arr.length; ++i) { |
|
|
|
int biggest = Integer.MAX_VALUE; |
|
|
|
int biggestJ = 0; |
|
|
|
Worker biggestW = null; |
|
|
|
|
|
|
|
for (int j = 0; j < n; ++j) { |
|
|
|
Worker w = workers[j]; |
|
|
|
if (is[j] >= w.arr.length) |
|
|
|
continue; |
|
|
|
|
|
|
|
int num = w.arr[is[j]]; |
|
|
|
|
|
|
|
if (num <= biggest) { |
|
|
|
biggest = num; |
|
|
|
biggestJ = j; |
|
|
|
biggestW = w; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
arr[i] = biggestW.arr[is[biggestJ]++]; |
|
|
|
} |
|
|
|
System.out.println(""); |
|
|
|
System.out.println("From "+w.start+" to "+w.end); |
|
|
|
*/ |
|
|
|
|
|
|
|
return arr; |
|
|
|
} |