基数排序 原始java实现 时间复杂度O(n)

来源:互联网 发布:php访问量 ip 编辑:程序博客网 时间:2024/06/10 11:57

修改自 http://www.java3z.com/article/article5/53429.html?id  原始的方式 能看懂 能写出来 能理解   原代码有bug

http://www.cnblogs.com/jingmoxukong/p/4311237.html#_labelTop#undefined 优化基数排序  代码看不懂 



private static void radixSort(int[] array, int d) {
int radix=10;//代表0-9
int n = 1;// 代表位数对应的数:1,10,100...
int k = 0;// 保存每一位排序后的结果用于下一位的排序输入
int length = array.length;
// 排序桶用于保存每次排序后的结果,这一位上排序结果相同的数字放在同一个桶里
int[][] bucket = new int[radix][length];

int[] order = new int[radix];// 用于保存每个桶里有多少个数字

while (n < d) {
for (int num : array) // 将数组array里的每个数字放在相应的桶里
{
int digit = (num / n) % 10;
bucket[digit][order[digit]] = num;
order[digit]++;//桶中存储的个数加1
}


// 将前一个循环生成的桶里的数据覆盖到原数组中用于保存这一位的排序结果
for (int i = 0; i < radix; i++) {
if (order[i] != 0)// 这个桶里有数据,从上到下遍历这个桶并将数据保存到原数组中
{
for (int j = 0; j < order[i]; j++) {
array[k] = bucket[i][j];
k++;
}
}
order[i] = 0;// 将桶里计数器置0,用于下一次位排序
}
n *= 10;
k = 0;// 将k置0,用于下一轮保存位排序结果
}
}


public static void main(String[] args) {
int[] A = new int[] {  93, 43, 55, 14, 0,28, 65, 39, 81 };
radixSort(A, 100);
for (int num : A) {
System.out.print(num+"\t");
}
}
0 0