package com.company; import com.sun.org.apache.xpath.internal.operations.Div; import java.util.Random; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.RecursiveTask; class DivideTask extends RecursiveTask { int[] arrayToDivide; final private int TRESHHOLD =100; public DivideTask(int[] arrayToDivide) { this.arrayToDivide = arrayToDivide; } protected int[] compute() { if(arrayToDivide.length>1) { int[] array_left = new int[arrayToDivide.length / 2]; int[] array_right = new int[arrayToDivide.length - array_left.length]; System.arraycopy(arrayToDivide, 0, array_left, 0, array_left.length); System.arraycopy(arrayToDivide, array_left.length, array_right, 0, array_right.length); DivideTask task1 = new DivideTask(array_left); DivideTask task2 = new DivideTask(array_right); task1.fork(); task2.fork(); //Wait for results from both tasks int[] tab1 = task1.join(); int[] tab2 = task2.join(); int[] scal_tab = new int[tab1.length + tab2.length]; scal_tab(tab1, tab2, scal_tab); return scal_tab; } return arrayToDivide; } private void scal_tab( int[] tab1, int[] tab2, int[] scal_tab) { int i = 0, j = 0, k = 0; while ((i < tab1.length) && (j < tab2.length)) { if (tab1[i] < tab2[j]) { scal_tab[k] = tab1[i++]; } else { scal_tab[k] = tab2[j++]; } k++; } if (i == tab1.length) { for (int a = j; a < tab2.length; a++) { scal_tab[k++] = tab2[a]; } } else { for (int a = i; a < tab1.length; a++) { scal_tab[k++] = tab1[a]; } } } public static void main(String[] args){ int[] tab = randomTab(); System.out.println("PRZED SORTOWANIEM:\n"); printTab(tab); DivideTask task = new DivideTask(tab); ForkJoinPool forkJoinPool = new ForkJoinPool(); forkJoinPool.invoke(task); int[] tab2 = task.join(); System.out.println("PO SORTOWANIU:\n"); printTab(tab2); } public static int[] randomTab(){ Random random = new Random(); int[] tab = new int[20]; for(int i =0;i<20;i++){ tab[i] = random.nextInt(1000); } return tab; } public static void printTab(int[] tab){ for(int i=0;i