University stuff.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

MultiRadixPar.java 3.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. import java.util.*;
  2. class MultiRadixPar{
  3. int n;
  4. int [] a;
  5. final static int NUM_BIT = 7; // alle tall 6-11 .. finn ut hvilken verdi som er best
  6. int nThreads = Math.min(
  7. Runtime.getRuntime().availableProcessors(),
  8. 8);
  9. int [] radixMulti(int [] a) {
  10. long tt = System.nanoTime();
  11. // 1-5 digit radixSort of : a[]
  12. int max = a[0], numBit = 2, numDigits, n =a.length;
  13. int [] bit ;
  14. // a) finn max verdi i a[]
  15. //Timer ta = new Timer().start();
  16. for (int i = 1 ; i < n ; i++)
  17. if (a[i] > max) max = a[i];
  18. while (max >= (1L<<numBit) )numBit++; // antall binaere siffer i max
  19. //System.out.println("A: "+ta.end().prettyTime());
  20. // bestem antall bit i numBits sifre
  21. numDigits = Math.max(1, numBit/NUM_BIT);
  22. bit = new int[numDigits];
  23. int rest = (numBit%numDigits), sum =0;;
  24. // fordel bitene vi skal sortere paa jevnt
  25. for (int i = 0; i < bit.length; i++){
  26. bit[i] = numBit/numDigits;
  27. if ( rest-- > 0) bit[i]++;
  28. }
  29. int[] t=a, b = new int [n];
  30. for (int i =0; i < bit.length; i++) {
  31. radixSort( a,b,bit[i],sum ); // i-te siffer fra a[] til b[]
  32. sum += bit[i];
  33. // swap arrays (pointers only)
  34. t = a;
  35. a = b;
  36. b = t;
  37. }
  38. return a;
  39. } // end radixMulti
  40. class Worker implements Runnable {
  41. int start, end, shift, mask;
  42. int[] a, b, count;
  43. Worker(int start, int end, int[] a, int[] b, int[] count, int shift, int mask) {
  44. this.start = start;
  45. this.end = end;
  46. this.a = a;
  47. this.b = b;
  48. this.count = count;
  49. this.shift = shift;
  50. this.mask = mask;
  51. }
  52. public void run() {
  53. for (int i = 0; i < a.length; i++) {
  54. int var = (a[i] >>> shift) & mask;
  55. if (var >= start && var < end) {
  56. b[count[var]++] = a[i];
  57. }
  58. }
  59. }
  60. }
  61. /** Sort a[] on one digit ; number of bits = maskLen, shiftet up 'shift' bits */
  62. void radixSort ( int [] a, int [] b, int maskLen, int shift){
  63. int n = a.length;
  64. int mask = (1<<maskLen) -1;
  65. int [] count = new int [mask+1];
  66. // b) count=the frequency of each radix value in a
  67. //Timer tb = new Timer().start();
  68. for (int i = 0; i < n; i++) {
  69. int var = (a[i]>>>shift) & mask;
  70. count[var]++;
  71. }
  72. //System.out.println("B: "+tb.end().prettyTime());
  73. // c) Add up in 'count' - accumulated values
  74. //Timer tc = new Timer().start();
  75. int j = 0;
  76. int acumVal = 0;
  77. for (int i = 0; i <= mask; i++) {
  78. j = count[i];
  79. count[i] = acumVal;
  80. acumVal += j;
  81. }
  82. //System.out.println("C: "+tc.end().prettyTime());
  83. Timer td = new Timer().start();
  84. int d = n / nThreads;
  85. Thread[] threads = new Thread[nThreads];
  86. for (int i = 0; i < nThreads; ++i) {
  87. int start = d * i;
  88. int end = i == nThreads - 1 ? n + 1 : d * (i + 1);
  89. Worker w = new Worker(start, end, a, b, count, shift, mask);
  90. Thread t = threads[i] = new Thread(w);
  91. t.start();
  92. }
  93. for (Thread t: threads) {
  94. try { t.join(); } catch (InterruptedException ex) {}
  95. }
  96. System.out.println("par D: "+td.end().prettyTime());
  97. //System.out.println("");
  98. }// end radixSort
  99. void testSort(int [] a){
  100. for (int i = 0; i< a.length-1;i++) {
  101. if (a[i] > a[i+1]){
  102. System.out.println("SorteringsFEIL på plass: "+i +" a["+i+"]:"+a[i]+" > a["+(i+1)+"]:"+a[i+1]);
  103. return;
  104. }
  105. }
  106. }// end simple sorteingstest
  107. }// end SekvensiellRadix