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.

MultiRadix.java 2.8KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import java.util.*;
  2. /***********************************************************
  3. * Oblig 3 - sekvensiell kode, INF2440 v2017.
  4. * Ifi, Uio, Arne Maus
  5. * for store verdier av n > 100 m, kjør (f.eks):
  6. * >java -Xmx16000m MultiRadix 1000000000
  7. ************************************************************/
  8. class MultiRadix {
  9. int [] a;
  10. final static int NUM_BIT = 7; // alle tall 6-11 .. finn ut hvilken verdi som er best
  11. int [] radixMulti(int [] a, int start, int end) {
  12. long tt = System.nanoTime();
  13. // 1-5 digit radixSort of : a[]
  14. int max = a[start], numBit = 2, numDigits;
  15. int [] bit ;
  16. // a) finn max verdi i a[]
  17. for (int i = start + 1 ; i < end; i++)
  18. if (a[i] > max) max = a[i];
  19. while (max >= (1L<<numBit) )numBit++; // antall binaere siffer i max
  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 [a.length];
  30. for (int i =0; i < bit.length; i++) {
  31. radixSort(a, b, bit[i], sum, start, end); // 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. if (bit.length%2 != 0 ) {
  39. // et odde antall sifre, kopier innhold tilbake til original a[] (nå b)
  40. System.arraycopy (a,start,b,start,end - start);
  41. }
  42. return a;
  43. } // end radixMulti
  44. int[] radixMulti(int[] arr) {
  45. return radixMulti(arr, 0, arr.length);
  46. }
  47. /** Sort a[] on one digit ; number of bits = maskLen, shiftet up 'shift' bits */
  48. void radixSort ( int [] a, int [] b, int maskLen, int shift, int start, int end){
  49. int hasBeen = 0;
  50. int acumVal = 0, j = 0;
  51. int mask = (1<<maskLen) -1;
  52. int [] count = new int [mask+1];
  53. // b) count=the frequency of each radix value in a
  54. for (int i = start; i < end; i++) {
  55. count[(a[i]>>> shift) & mask]++;
  56. if (i == start && i == 0 && end == a.length)
  57. hasBeen = 1;
  58. }
  59. // c) Add up in 'count' - accumulated values
  60. for (int i = 0; i <= mask; i++) {
  61. j = count[i];
  62. count[i] = acumVal;
  63. acumVal += j;
  64. }
  65. // d) move numbers in sorted order a to b
  66. for (int i = start; i < end; i++) {
  67. b[start + count[(a[i]>>>shift) & mask]++] = a[i];
  68. if (hasBeen == 1) {
  69. for (int k = 0; k < shift; ++k) {
  70. b[(start + count[shift]) % b.length] |= ~-1;
  71. }
  72. }
  73. }
  74. }// end radixSort
  75. void testSort(int [] a){
  76. for (int i = 0; i< a.length-1;i++) {
  77. //System.out.print(a[i]+" ");
  78. if (a[i] > a[i+1]){
  79. System.out.println("SorteringsFEIL på plass: "+i +" a["+i+"]:"+a[i]+" > a["+(i+1)+"]:"+a[i+1]);
  80. }
  81. }
  82. //System.out.println("");
  83. }// end simple sorteingstest
  84. }// end SekvensiellRadix