-
Notifications
You must be signed in to change notification settings - Fork 20.2k
Description
Description
Hello, I have some questions about the hash
method in the BucketSort
class and would like to discuss it with you.
It seems that the logic of the hash
method is designed for numeric types (such as Integer
), but it is currently a generic method. The return value of compareTo
is an ordinal, not a magnitude that can be used for calculating proportions. For example, for the numbers 10 and 30, the range we need is 20, but 30.compareTo(10)
returns 1 (for numeric types, the compareTo
method only returns -1, 0, or 1).
This means that for any non-numeric Comparable
type (such as String
), or even for numeric types themselves, the current bucketing strategy does not work properly (although the sorting result appears to be correct).
Moreover, when all elements are equal, the range
variable is 0, which will cause a division-by-zero exception. Although Java converts NaN to 0 instead of throwing an exception, this seems to be a logical error as well.
private <T extends Comparable<T>> int hash(final T element, final T min, final T max, final int numberOfBuckets) {
double range = max.compareTo(min);
double normalizedValue = element.compareTo(min) / range;
return (int) (normalizedValue * (numberOfBuckets - 1));
}
Steps to reproduce
For example, when all the elements in the array are 1, the above logic will incorrectly place all the elements into the bucket with index 0.
When the array elements are not identical, the above logic will incorrectly place the elements into only two buckets, which is determined solely by the -1, 0, or 1 returned by the compareTo
method, rather than the correct mapping index.

Excepted behavior
After reviewing some related issues, it seems that the author does not intend to change the generic signature. Therefore, I hope to document the relevant issues in the comments so that future learners can understand the logic.
If my wording is inappropriate, please forgive me. I am just a learner.
Screenshots
No response
Additional context
No response