桶中的桶大小排序

时间:2016-12-27 14:10:29

标签: java algorithm sorting

我正在尝试为桶排序编写代码,但我对每个桶的桶大小感到困惑。我的代码如下。 输入数组:{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

2 个答案:

答案 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]);