Bucket Sort - это уже O (n ^ 2) наихудший случай, поэтому я бы просто сделал здесь простой внутренний / внешний цикл.Поскольку ваш массив блоков обязательно короче вашего входного массива, держите его во внутреннем цикле.Поскольку вы используете нестандартные размеры сегментов, на самом деле нет никаких математических приемов, которые могли бы устранить этот внутренний цикл.
int[] freq = new int[buckets.length - 1];
foreach(int d in input)
{
for(int i = 0; i < buckets.length - 1; i++)
{
if(d >= buckets[i] && d < buckets[i+1])
{
freq[i]++;
break;
}
}
}
Это также O (n ^ 2) худший случай, но вы не можете превзойти простоту кода,Я не буду беспокоиться об оптимизации, пока она не станет реальной проблемой.Если у вас есть большой массив блоков, вы можете использовать какой-то двоичный поиск.Но, поскольку распределение частот обычно составляет <100 элементов, я сомневаюсь, что вы увидите значительное повышение производительности в реальных условиях. </p>