import java.util.*; class MultiRadixPar{ int n; volatile int[] a; final static int NUM_BIT = 7; // alle tall 6-11 .. finn ut hvilken verdi som er best int nThreads = Math.min( Runtime.getRuntime().availableProcessors(), 8); class PartAWorker implements Runnable { int start; int end; int biggest; PartAWorker(int start, int end) { this.start = start; this.end = end; this.biggest = a[start]; } public void run() { for (int i = start + 1; i < end; ++i) { if (a[i] > biggest) biggest = a[i]; } } } int [] radixMulti(int [] a_) { this.a = a_; // 1-5 digit radixSort of : a[] int max = a[0], numBit = 2, numDigits, n =a.length; int [] bit ; // a) finn max verdi i a[] //Timer ta = new Timer().start(); int d = a.length / nThreads; Thread[] threads = new Thread[nThreads]; PartAWorker[] workers = new PartAWorker[nThreads]; for (int i = 0; i < nThreads; ++i) { PartAWorker w = workers[i] = new PartAWorker( d * i, i == nThreads - 1 ? a.length : d * (i + 1)); Thread t = threads[i] = new Thread(w); t.start(); } for (Thread t: threads) { try { t.join(); } catch (InterruptedException ex) {} } max = workers[0].biggest; for (int i = 1; i < nThreads; ++i) { if (workers[i].biggest > max) max = workers[i].biggest; } while (max >= (1L< 0) bit[i]++; } int[] t=a, b = new int [n]; for (int i =0; i < bit.length; i++) { radixSort( b,bit[i],sum ); // i-te siffer fra a[] til b[] sum += bit[i]; // swap arrays (pointers only) t = a; a = b; b = t; } if (bit.length%2 == 0 ) { // et odde antall sifre, kopier innhold tilbake til original a[] (nå b) System.arraycopy (b,0,a,0,a.length); } return a; } // end radixMulti class PartDWorker implements Runnable { int start, end, shift, mask; int[] b, count; PartDWorker(int start, int end, int[] b, int[] count, int shift, int mask) { this.start = start; this.end = end; this.b = b; this.count = count; this.shift = shift; this.mask = mask; } public void run() { for (int i = 0; i < n; i++) { int var = (a[i] >>> shift) & mask; if (var >= start && var < end) { b[count[var]++] = a[i]; } } } } /** Sort a[] on one digit ; number of bits = maskLen, shiftet up 'shift' bits */ void radixSort (int [] b, int maskLen, int shift){ int n = a.length; int mask = (1<>>shift) & mask; count[var]++; if (var > biggestVar) biggestVar = var; } //System.out.println("B: "+tb.end().prettyTime()); // c) Add up in 'count' - accumulated values //Timer tc = new Timer().start(); int j = 0; int acumVal = 0; for (int i = 0; i <= mask; i++) { j = count[i]; count[i] = acumVal; acumVal += j; } //System.out.println("C: "+tc.end().prettyTime()); //Timer td = new Timer().start(); int d = biggestVar / nThreads; Thread[] threads = new Thread[nThreads]; for (int i = 0; i < nThreads; ++i) { int start = d * i; int end = i == nThreads - 1 ? n + 1 : d * (i + 1); PartDWorker w = new PartDWorker(start, end, b, count, shift, mask); Thread t = threads[i] = new Thread(w); t.start(); } for (Thread t: threads) { try { t.join(); } catch (InterruptedException ex) {} } //System.out.println("par D: "+td.end().prettyTime()); }// end radixSort void testSort(int [] a){ for (int i = 0; i< a.length-1;i++) { if (a[i] > a[i+1]){ System.out.println("SorteringsFEIL på plass: "+i +" a["+i+"]:"+a[i]+" > a["+(i+1)+"]:"+a[i+1]); return; } } }// end simple sorteingstest }// end SekvensiellRadix