基本思想: 将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。 然后 从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。
演示:
Java代码:
import java.util.Arrays;
public class LinearTimeSorter {
/**
* 基数排序。将每个int(32位)拆分为8个4位组(或许拆分成4个8位组更好),
* 对每个四位组采用计数排序(最大值为15)。
*
* 注意:该算法只能对非负整数进行排序。
*/
private static final int BITS_PER_GROUPS = 4;
private static final int GROUPS_COUNT = 31 / BITS_PER_GROUPS + 1;
private static final int[] MASK_TABLE = new int[GROUPS_COUNT];
static {
MASK_TABLE[0] = (1 << BITS_PER_GROUPS) - 1;
for (int i = 1; i < MASK_TABLE.length; i++) {
MASK_TABLE[i] = MASK_TABLE[i-1] << BITS_PER_GROUPS;
}
};
public static void radixSort(int[] array) {
// 对8个4位组进行排序
for (int j = 0; j < GROUPS_COUNT; j++) {
int mask = MASK_TABLE[j];
// 使用计数排序对4位组进行排序
int[] counting = new int[1 << BITS_PER_GROUPS];
for (int i = 0; i < array.length; i++) {
counting[(array[i] & mask) >>> (j*BITS_PER_GROUPS)]++;
}
for (int i = 1; i < counting.length; i++) {
counting[i] += counting[i-1];
}
int[] tempArray = new int[array.length];
for (int i = array.length - 1; i >= 0 ; i--) {
tempArray[--counting[(array[i] & mask) >>> (j*BITS_PER_GROUPS)]] = array[i];
}
// copy back
System.arraycopy(tempArray, 0, array, 0, tempArray.length);
}
}
public static void main(String[] args) {
int[] a = new int[] { 13, 30, 5, 21, 17, 25, 3, 9 , 2000};
radixSort(a);
System.out.println(Arrays.toString(a));
}
}