前言
基数排序(radix sort)又称桶排序(bucket sort),相对于常见的比较排序,基数排序是一种分配式排序,即通过将所有数字分配到应在的位置最后再覆盖到原数组完成排序的过程。
所谓桶排序,就是根据数据关键字建立不同的桶,然后将元素分别插入各个桶。如下图:
基数排序,基数即为十进制的位数。
基数排序算法过程:
①初始化:构造一个10*n的二维数组,一个长度为n的数组用于存储每次位排序时每个桶子里有多少个元素。
②循环操作:从低位开始(次位优先(LSD)),将所有元素对应该位的数字存到相应的桶子里去(对应二维数组的那一列)。然后将所有桶子里的元素按照桶子标号从小到大取出,对于同一个桶子里的元素,先放进去的先取出,后放进去的后取出(保证排序稳定性)。这样原数组就按该位排序完毕了,继续下一位操作,直到最高位排序完成。
如下图:
代码示例:
public class RadixSort {
private static void radixSort(int[] array, int d) {
int n = 1;
int k = 0;
int length = array.length;
int[][] bucket = new int[10][length];
int[] order = new int[length];
while (n < d) {
for (int num : array) {
int digit = (num / n) % 10;
bucket[digit][order[digit]] = num;
order[digit]++;
}
for (int i = 0; i < length; i++) {
if (order[i] != 0) {
for (int j = 0; j < order[i]; j++) {
array[k] = bucket[i][j];
k++;
}
}
order[i] = 0;
}
n *= 10;
k = 0;
}
}
public static void main(String[] args) {
int[] A = new int[] { 73, 22, 93, 43, 55, 14, 28, 65, 39, 81, 2332, 112, 3132, 342 };
radixSort(A, 100000);
for (int num : A) {
System.out.println(num);
}
}
}