|
|
@@ -0,0 +1,107 @@ |
|
|
|
import java.util.*; |
|
|
|
/*********************************************************** |
|
|
|
* Oblig 3 - sekvensiell kode, INF2440 v2017. |
|
|
|
* Ifi, Uio, Arne Maus |
|
|
|
* for store verdier av n > 100 m, kjør (f.eks): |
|
|
|
* >java -Xmx16000m MultiRadix 1000000000 |
|
|
|
************************************************************/ |
|
|
|
class MultiRadix{ |
|
|
|
int n; |
|
|
|
int [] a; |
|
|
|
final static int NUM_BIT = 7; // alle tall 6-11 .. finn ut hvilken verdi som er best |
|
|
|
|
|
|
|
public static void main(String [] args) { |
|
|
|
if (args.length != 1) { |
|
|
|
System.out.println(" bruk : >java SekvensiellRadix <n> "); |
|
|
|
} else { |
|
|
|
int n = Integer.parseInt(args[0]); |
|
|
|
new MultiRadix().doIt(n); |
|
|
|
} |
|
|
|
} // end main |
|
|
|
|
|
|
|
void doIt (int len) { |
|
|
|
a = new int[len]; |
|
|
|
Random r = new Random(123); |
|
|
|
for (int i =0; i < len;i++) { |
|
|
|
a[i] = r.nextInt(len); |
|
|
|
} |
|
|
|
a = radixMulti(a); |
|
|
|
} // end doIt |
|
|
|
|
|
|
|
int [] radixMulti(int [] a) { |
|
|
|
long tt = System.nanoTime(); |
|
|
|
// 1-5 digit radixSort of : a[] |
|
|
|
int max = a[0], numBit = 2, numDigits, n =a.length; |
|
|
|
int [] bit ; |
|
|
|
|
|
|
|
// a) finn max verdi i a[] |
|
|
|
for (int i = 1 ; i < n ; i++) |
|
|
|
if (a[i] > max) max = a[i]; |
|
|
|
while (max >= (1L<<numBit) )numBit++; // antall binaere siffer i max |
|
|
|
|
|
|
|
// bestem antall bit i numBits sifre |
|
|
|
numDigits = Math.max(1, numBit/NUM_BIT); |
|
|
|
bit = new int[numDigits]; |
|
|
|
int rest = (numBit%numDigits), sum =0;; |
|
|
|
|
|
|
|
// fordel bitene vi skal sortere paa jevnt |
|
|
|
for (int i = 0; i < bit.length; i++){ |
|
|
|
bit[i] = numBit/numDigits; |
|
|
|
if ( rest-- > 0) bit[i]++; |
|
|
|
} |
|
|
|
|
|
|
|
int[] t=a, b = new int [n]; |
|
|
|
|
|
|
|
for (int i =0; i < bit.length; i++) { |
|
|
|
radixSort( a,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 (a,0,b,0,a.length); |
|
|
|
} |
|
|
|
|
|
|
|
double tid = (System.nanoTime() -tt)/1000000.0; |
|
|
|
System.out.println("\nSorterte "+n+" tall paa:" + tid + "millisek."); |
|
|
|
testSort(a); |
|
|
|
return a; |
|
|
|
} // end radixMulti |
|
|
|
|
|
|
|
/** Sort a[] on one digit ; number of bits = maskLen, shiftet up 'shift' bits */ |
|
|
|
void radixSort ( int [] a, int [] b, int maskLen, int shift){ |
|
|
|
System.out.println(" radixSort maskLen:"+maskLen+", shift :"+shift); |
|
|
|
int acumVal = 0, j, n = a.length; |
|
|
|
int mask = (1<<maskLen) -1; |
|
|
|
int [] count = new int [mask+1]; |
|
|
|
|
|
|
|
// b) count=the frequency of each radix value in a |
|
|
|
for (int i = 0; i < n; i++) { |
|
|
|
count[(a[i]>>> shift) & mask]++; |
|
|
|
} |
|
|
|
|
|
|
|
// c) Add up in 'count' - accumulated values |
|
|
|
for (int i = 0; i <= mask; i++) { |
|
|
|
j = count[i]; |
|
|
|
count[i] = acumVal; |
|
|
|
acumVal += j; |
|
|
|
} |
|
|
|
// d) move numbers in sorted order a to b |
|
|
|
for (int i = 0; i < n; i++) { |
|
|
|
b[count[(a[i]>>>shift) & mask]++] = a[i]; |
|
|
|
} |
|
|
|
|
|
|
|
}// 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 |