问题描述
给定一个非负整数数组,其中不同的整数可能有不同的位数,但数组中所有整数的总位数为 n。展示如何在 O(n) 时间内对数组进行排序。为了解决这个问题,我们将一个整数表示为一个字节数组。每个字节代表一个数字(基数为 128)。数组中索引为 0 的字节表示最低有效字节。也就是说,如果A的长度为3,A[0] = 6,A[1] = 7,A[2] = 8,则A代表数字6 × 1280 + 7 × 1281 + 8 × 1283.
private static void problem(byte[][] arr)
{
// Counting Sort
int[] count = new int[128];
int ind = 0;
for(int i =0; i < arr.length; i++)
{
count[arr[i][ind]]++;
}
int k = 0;
for(int i =0 ; i < count.length; i++)
{
for(int j = 0; j < count[i]; j++)
arr[k++][k++] = (byte) i;
}
//Radix Sort
int max = arr[0][0];
for(int i = 1; i < arr.length; i++)
{
if(arr[i][i] > max)
max = arr[i][i];
}
int place = 1;
int digits = (int) (Math.log10(max) + 1);
int[] free = new int[10];
int[] sort = new int[arr.length];
while(digits-- > 0)
{
for(int i =0; i < arr.length; i++)
{
int digit = (arr[i][i] / place) % 10;
free[digit]++;
for(i = 1; i < 10; i++)
{
free[i] += free[i-1];
}
for(i = arr.length-1; i >= 0; i--)
{
int digit2 = (arr[i][i] / place) % 10;
sort[free[digit2] - 1] = arr[i][i];
free[digit2]--;
}
place *= 10;
}
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)