Browse Source

added inf2440 hw3

master
mortie 7 years ago
parent
commit
345dc7ac01
2 changed files with 107 additions and 0 deletions
  1. BIN
      inf2440/hw3/MultiRadix.class
  2. 107
    0
      inf2440/hw3/MultiRadix.java

BIN
inf2440/hw3/MultiRadix.class View File


+ 107
- 0
inf2440/hw3/MultiRadix.java View File

@@ -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

Loading…
Cancel
Save