|
|
Radix Sort Algorithm - Algorithm
|
Views : 899
|
|
Tagged in : Algorithm
|
|
|
Report This Scrap as Inappropriate We request you to choose the appropriate categroy and subcategory that suits your
objectionable concern about the scrap, So that our team can review and find out whether it violates our Guidelines or the
scrap is not suitable for all viewers.
|
/*
* @!RadixSortAlgorithm.java
* By: Alvin Raj
* Date: 12 August 2002
* Algorithm adapted from: C++ Data Structures, Nell Dale
* Additional Comments added by Jason Harrison <harrison@cs.ubc.ca>
*
* Algorithm comments from
* http://ciips.ee.uwa.edu.au/~morris/Year2/PLDS210/radixsort.html
*
*/
public class RadixSortAlgorithm extends SortAlgorithm {
// for each of the 10 digits
private LinkedQueue[] Q =
{ new LinkedQueue(), //0
new LinkedQueue(), //1
new LinkedQueue(), //2
new LinkedQueue(), //3
new LinkedQueue(), //4
new LinkedQueue(), //5
new LinkedQueue(), //6
new LinkedQueue(), //7
new LinkedQueue(), //8
new LinkedQueue()}; //9
// Assumes all positive integers
// numbDigits is the number of digits in the largest number
void sort(int a[] , int numDigits) throws Exception {
int arrayPos;
// i is the radix
for (int i = 1; i <= numDigits; i++) {
if (stopRequested) {
return;
}
arrayPos = 0;
// Put values into queues according to radix
// least significant digit first, then second,...
// first pass sorts on least significant digit
for (int j = 0; j < a.length; j++) {
Q[getRadix(a[j],i)].enqueue(a[j]);
pause(-1,j); // JH
}
// Collect the queues and put them back into the array
// queues contain partially sorted lists after first
// pass -- moving to next significant digit will
// maintain this ordering.
for (int j = 0; j < Q.length; j++) {
while(!Q[j].isEmpty()) {
a[arrayPos] = Q[j].dequeue();
arrayPos++;
}
pause(-1,arrayPos);
}
}
}
void sort(int a[]) throws Exception {
// Find the largest entry in a[]
int max = 0;
int maxIndex = 0; // JH
for (int i = 0; i < a.length; i++) {
if (max < a[i]) {
max = a[i];
maxIndex = i; // JH
pause(maxIndex, i); // JH
}
}
int numDigits = 1;
int temp = 10;
// compute the max number of digits
// JH: this could be more easily be computed by using
// numDigits = (int) log(base10, max)
while (true) {
if (max >= temp) {
numDigits++;
temp*=10;
}
else
break;
}
//call the sort
sort(a,numDigits);
}
//returns the radix of the given number
//EG:
//2nd radix of 79981 is 8
//1st radix of 79981 is 1
public static int getRadix(int number, int radix) {
return (int)(number / Math.pow(10,radix-1)) % 10;
}
}
|
|
By Vijayaprasad, On - 2010-01-28 |
|
|
|