73 lines
1.7 KiB
Java
73 lines
1.7 KiB
Java
|
|
||
|
|
||
|
import edu.princeton.cs.introcs.StdIn;
|
||
|
import edu.princeton.cs.introcs.StdOut;
|
||
|
|
||
|
/***********************************************************************************
|
||
|
* Compilation: javac LSD.java
|
||
|
* Execution: java LSD < input.txt
|
||
|
*
|
||
|
* LSD radix sort an array of extended ASCII strings, each of length W.
|
||
|
*
|
||
|
* % java LSD < words3.txt
|
||
|
* all
|
||
|
* bad
|
||
|
* bed
|
||
|
* bug
|
||
|
* dad
|
||
|
* ...
|
||
|
* yes
|
||
|
* yet
|
||
|
* zoo
|
||
|
*
|
||
|
***********************************************************************************/
|
||
|
|
||
|
public class LSD {
|
||
|
|
||
|
// LSD radix sort
|
||
|
public static void sort(String[] a, int W) {
|
||
|
int N = a.length;
|
||
|
int R = 256; // extend ASCII alphabet size
|
||
|
String[] aux = new String[N];
|
||
|
|
||
|
for (int d = W-1; d >= 0; d--) {
|
||
|
// sort by key-indexed counting on dth character
|
||
|
|
||
|
// compute frequency counts
|
||
|
int[] count = new int[R+1];
|
||
|
for (int i = 0; i < N; i++)
|
||
|
count[a[i].charAt(d) + 1]++;
|
||
|
|
||
|
// compute cumulates
|
||
|
for (int r = 0; r < R; r++)
|
||
|
count[r+1] += count[r];
|
||
|
|
||
|
// move data
|
||
|
for (int i = 0; i < N; i++)
|
||
|
aux[count[a[i].charAt(d)]++] = a[i];
|
||
|
|
||
|
// copy back
|
||
|
for (int i = 0; i < N; i++)
|
||
|
a[i] = aux[i];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
public static void main(String[] args) {
|
||
|
String[] a = StdIn.readAllStrings();
|
||
|
int N = a.length;
|
||
|
|
||
|
// check that strings have fixed length
|
||
|
int W = a[0].length();
|
||
|
for (int i = 0; i < N; i++)
|
||
|
assert a[i].length() == W : "Strings must have fixed length";
|
||
|
|
||
|
// sort the strings
|
||
|
sort(a, W);
|
||
|
|
||
|
// print results
|
||
|
for (int i = 0; i < N; i++)
|
||
|
StdOut.println(a[i]);
|
||
|
}
|
||
|
}
|