University stuff.
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

MultiRadix.java 2.6KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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. int [] radixMulti(int [] a) {
  13. long tt = System.nanoTime();
  14. // 1-5 digit radixSort of : a[]
  15. int max = a[0], numBit = 2, numDigits, n =a.length;
  16. int [] bit ;
  17. // a) finn max verdi i a[]
  18. for (int i = 1 ; i < n ; i++)
  19. if (a[i] > max) max = a[i];
  20. while (max >= (1L<<numBit) )numBit++; // antall binaere siffer i max
  21. // bestem antall bit i numBits sifre
  22. numDigits = Math.max(1, numBit/NUM_BIT);
  23. bit = new int[numDigits];
  24. int rest = (numBit%numDigits), sum =0;;
  25. // fordel bitene vi skal sortere paa jevnt
  26. for (int i = 0; i < bit.length; i++){
  27. bit[i] = numBit/numDigits;
  28. if ( rest-- > 0) bit[i]++;
  29. }
  30. int[] t=a, b = new int [n];
  31. for (int i =0; i < bit.length; i++) {
  32. radixSort( a,b,bit[i],sum ); // i-te siffer fra a[] til b[]
  33. sum += bit[i];
  34. // swap arrays (pointers only)
  35. t = a;
  36. a = b;
  37. b = t;
  38. }
  39. if (bit.length%2 != 0 ) {
  40. // et odde antall sifre, kopier innhold tilbake til original a[] (nå b)
  41. System.arraycopy (a,0,b,0,a.length);
  42. }
  43. return a;
  44. } // end radixMulti
  45. /** Sort a[] on one digit ; number of bits = maskLen, shiftet up 'shift' bits */
  46. void radixSort ( int [] a, int [] b, int maskLen, int shift){
  47. int acumVal = 0, j, n = a.length;
  48. int mask = (1<<maskLen) -1;
  49. int [] count = new int [mask+1];
  50. // b) count=the frequency of each radix value in a
  51. for (int i = 0; i < n; i++) {
  52. count[(a[i]>>> shift) & mask]++;
  53. }
  54. // c) Add up in 'count' - accumulated values
  55. for (int i = 0; i <= mask; i++) {
  56. j = count[i];
  57. count[i] = acumVal;
  58. acumVal += j;
  59. }
  60. // d) move numbers in sorted order a to b
  61. Timer t = new Timer().start();
  62. for (int i = 0; i < n; i++) {
  63. b[count[(a[i]>>>shift) & mask]++] = a[i];
  64. }
  65. t.end();
  66. System.out.println("seq D from "+0+" to "+n+": "+t.prettyTime());
  67. }// end radixSort
  68. void testSort(int [] a){
  69. for (int i = 0; i< a.length-1;i++) {
  70. if (a[i] > a[i+1]){
  71. System.out.println("SorteringsFEIL på plass: "+i +" a["+i+"]:"+a[i]+" > a["+(i+1)+"]:"+a[i+1]);
  72. return;
  73. }
  74. }
  75. }// end simple sorteingstest
  76. }// end SekvensiellRadix