📜  桶排序java(1)

📅  最后修改于: 2023-12-03 15:26:42.882000             🧑  作者: Mango

桶排序

桶排序(Bucket Sort)属于线性排序,是将要排序的数据分到有限数量的桶子里,每个桶子再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序),最后依次把各个桶中的数据有序地合并起来。

桶排序的时间复杂度为O(n+k),其中n为排序元素个数,k是桶的个数。

下面我们来看一下Java中的实现。

Java代码
public class BucketSort {
    public static void bucketSort(int[] array, int bucketSize) {
        if (array.length < 2) {
            return;
        }

        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];
            }
        }

        int bucketCount = (maxValue - minValue) / bucketSize + 1;
        List<List<Integer>> buckets = new ArrayList<>(bucketCount);
        for (int i = 0; i < bucketCount; i++) {
            buckets.add(new ArrayList<>());
        }

        for (int i = 0; i < array.length; i++) {
            buckets.get((array[i] - minValue) / bucketSize).add(array[i]);
        }

        int currentIndex = 0;

        for (int i = 0; i < bucketCount; i++) {
            List<Integer> bucket = buckets.get(i);
            Collections.sort(bucket);
            for (int j = 0; j < bucket.size(); j++) {
                array[currentIndex++] = bucket.get(j);
            }
        }
    }
}

代码解析:

  • 代码中的 minValuemaxValue 分别表示数组中最小值和最大值;
  • bucketSize 表示桶的大小;
  • bucketCount 表示桶的个数;
  • buckets 是一个List,表示桶的集合;
  • 在把数组中的数据分到对应的桶中时,需要先通过 (array[i] - minValue) / bucketSize 计算数组元素所在的桶的下标,然后将数据放到对应的桶中;
  • 最后,遍历桶的集合,取出每个桶中的数据,进行排序,然后依次放回原数组中。

桶排序的思想简单,实现也比较容易,但需要根据具体的数据情况来选择合适的桶大小和桶个数。