我正在尝试为桶排序编写代码,但我对每个桶的桶大小感到困惑。我的代码如下。 输入数组:{12,11,13,5,6,7,10,22,4,16,1,26};
我正在传递每个桶的桶大小> 3然后我没有按排序顺序获得输出。它为铲斗尺寸1和2提供了完美的答案
public void bucsort(int[] arr,int bucketSize){
if(arr.length==0) return;
int max=arr[0];
int min=arr[0];
for(int i=0; i<arr.length;i++){
if(arr[i]<min)
{
min=arr[i];
}
else
max=arr[i];
}
int bucketCount= (max - min) / bucketSize + 1;
List<List<Integer>> buckets = new ArrayList<List<Integer>>(bucketCount);
// int divider= (max+1)/bucketCount;
for (int i = 0; i < bucketCount; i++) {
buckets.add(new ArrayList<Integer>());
}
for (int i = 0; i < arr.length; i++) {
buckets.get((arr[i]-min) / bucketSize).add(arr[i]);
}
int currentIndex = 0;
for (int i = 0; i < buckets.size(); i++) {
Integer[] bucketArray = new Integer[buckets.get(i).size()];
bucketArray = buckets.get(i).toArray(bucketArray);
InsertionSort(bucketArray);
for (int j = 0; j < bucketArray.length; j++) {
arr[currentIndex++] = bucketArray[j];
}
}
}
没有关系吗?水桶及其大小?
我编辑了max-min函数的方法,并调试了程序。我的插入排序似乎有些错误
代码是:
public void InsertionSort(Integer[] arr){
for(int i=1; i<arr.length; i++){
int value=arr[i];
int hole=i;
while(hole>0 && arr[hole-1]>value){
arr[hole]=arr[hole-1];
hole--;
}
arr[hole-1]=value;
}
}
主要功能
public static void main(String[] args) {
int arr[] = {12, 11, 13, 5, 6, 7,10,22,4,16,1,26};
BucketSort ob = new BucketSort();
ob.bucsort(arr, 5);
printArray(arr);
}
static void printArray(int arr[])
{
int n = arr.length;
for (int i=0; i<n; ++i)
System.out.print(arr[i] + " ");
System.out.println();
}
我的铲斗尺寸5:5 1 4 6 7 10 12 11 13 16 22 26 尺寸3:1 5 4 6 7 12 10 11 13 16 22 26 尺寸2:1 4 5 6 7 10 12 11 13 16 22 26
答案 0 :(得分:1)
查找max-min是错误的...(您有一些逻辑错误)
int minValue = array[0];
int maxValue = array[0];
for (int i = 1; i < array.Length; i++) {
if (array[i] < minValue) {
minValue = array[i];
} else if (array[i] > maxValue) {
maxValue = array[i];
}
}
在你的代码上:
1 4 3
min 1 1 1
max 1 4 3
这将是正确的实施
for (i = 1; i < length; i++) {
j = i;
while (j > 0 && arr[j - 1] > arr[j]) {
tmp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = tmp;
j--;
}
}
我会在有空的时候调试你的代码..
答案 1 :(得分:0)
使用InsertionSort
方法
int value=arr[i];
int hole=i;
while(hole>0 && arr[hole]>value){
此时arr[hole]
将始终等于value
,因此您永远不会进入while
循环。所以什么都没有排序。对于小水桶尺寸,您可能很幸运,无所谓。对于铲斗尺寸1,它肯定不会。即使对于2号桶,您在排序时也会出现一个错误。我明白了:
1 4 5 6 7 10 12 11 13 16 22 26
12在11之前出现,因为这两个数字最终都在同一个桶中,并且没有被排序。
我从你的评论中得到了这个:while (hole > 0 && arr[hole - 1] > value) {
。根据您的要求,现在方法如下:
public void insertionSort(Integer[] arr) { // renamed to small i since it’s a method
for (int i = 1; i < arr.length; i++) {
int value = arr[i];
int hole = i;
while (hole > 0 && arr[hole - 1] > value) {
arr[hole] = arr[hole - 1];
hole--;
}
arr[hole] = value;
}
}
现在我得到正确的排序,所有铲斗尺寸从1到19.如果你仍有问题,那么我们必须采用相同的方式。
这是暂时的,但正如前面提到的那样,您的代码中存在查找max
的错误。我尝试了这个输入:
int arr[] = { 3, 10, 4 };
我得到max
4(预期:10),然后java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
在这一行:
buckets.get((arr[i]-min) / bucketSize).add(arr[i]);