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 3.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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 n;
  10. int [] a;
  11. final static int NUM_BIT = 7; // alle tall 6-11 .. finn ut hvilken verdi som er best
  12. public static void main(String [] args) {
  13. if (args.length != 1) {
  14. System.out.println(" bruk : >java SekvensiellRadix <n> ");
  15. } else {
  16. int n = Integer.parseInt(args[0]);
  17. new MultiRadix().doIt(n);
  18. }
  19. } // end main
  20. void doIt (int len) {
  21. a = new int[len];
  22. Random r = new Random(123);
  23. for (int i =0; i < len;i++) {
  24. a[i] = r.nextInt(len);
  25. }
  26. a = radixMulti(a);
  27. } // end doIt
  28. int [] radixMulti(int [] a) {
  29. long tt = System.nanoTime();
  30. // 1-5 digit radixSort of : a[]
  31. int max = a[0], numBit = 2, numDigits, n =a.length;
  32. int [] bit ;
  33. // a) finn max verdi i a[]
  34. for (int i = 1 ; i < n ; i++)
  35. if (a[i] > max) max = a[i];
  36. while (max >= (1L<<numBit) )numBit++; // antall binaere siffer i max
  37. // bestem antall bit i numBits sifre
  38. numDigits = Math.max(1, numBit/NUM_BIT);
  39. bit = new int[numDigits];
  40. int rest = (numBit%numDigits), sum =0;;
  41. // fordel bitene vi skal sortere paa jevnt
  42. for (int i = 0; i < bit.length; i++){
  43. bit[i] = numBit/numDigits;
  44. if ( rest-- > 0) bit[i]++;
  45. }
  46. int[] t=a, b = new int [n];
  47. for (int i =0; i < bit.length; i++) {
  48. radixSort( a,b,bit[i],sum ); // i-te siffer fra a[] til b[]
  49. sum += bit[i];
  50. // swap arrays (pointers only)
  51. t = a;
  52. a = b;
  53. b = t;
  54. }
  55. if (bit.length%2 != 0 ) {
  56. // et odde antall sifre, kopier innhold tilbake til original a[] (nå b)
  57. System.arraycopy (a,0,b,0,a.length);
  58. }
  59. double tid = (System.nanoTime() -tt)/1000000.0;
  60. System.out.println("\nSorterte "+n+" tall paa:" + tid + "millisek.");
  61. testSort(a);
  62. return a;
  63. } // end radixMulti
  64. /** Sort a[] on one digit ; number of bits = maskLen, shiftet up 'shift' bits */
  65. void radixSort ( int [] a, int [] b, int maskLen, int shift){
  66. System.out.println(" radixSort maskLen:"+maskLen+", shift :"+shift);
  67. int acumVal = 0, j, n = a.length;
  68. int mask = (1<<maskLen) -1;
  69. int [] count = new int [mask+1];
  70. // b) count=the frequency of each radix value in a
  71. for (int i = 0; i < n; i++) {
  72. count[(a[i]>>> shift) & mask]++;
  73. }
  74. // c) Add up in 'count' - accumulated values
  75. for (int i = 0; i <= mask; i++) {
  76. j = count[i];
  77. count[i] = acumVal;
  78. acumVal += j;
  79. }
  80. // d) move numbers in sorted order a to b
  81. for (int i = 0; i < n; i++) {
  82. b[count[(a[i]>>>shift) & mask]++] = a[i];
  83. }
  84. }// end radixSort
  85. void testSort(int [] a){
  86. for (int i = 0; i< a.length-1;i++) {
  87. if (a[i] > a[i+1]){
  88. System.out.println("SorteringsFEIL på plass: "+i +" a["+i+"]:"+a[i]+" > a["+(i+1)+"]:"+a[i+1]);
  89. return;
  90. }
  91. }
  92. }// end simple sorteingstest
  93. }// end SekvensiellRadix