关于java:JAVA十大排序算法之桶排序详解

10次阅读

共计 2168 个字符,预计需要花费 6 分钟才能阅读完成。

目录
桶排序
代码实现
工夫复杂度
算法稳定性
总结
桶排序
桶排序是计数排序的降级,计数排序能够看成每个桶只存储雷同元素,而桶排序每个桶存储肯定范畴的元素,通过函数的某种映射关系,将待排序数组中的元素映射到各个对应的桶中,对每个桶中的元素进行排序(有可能再应用别的排序算法或是以递归形式持续应用桶排序),最初将非空桶中的元素一一放入原序列中。

桶排序须要尽量保障元素扩散平均,否则当所有数据集中在同一个桶中时,桶排序生效。
代码实现
1. 找出数组中的最大值 max 和最小值 min,能够确定出数组所在范畴 min~max

2. 依据数据范畴确定桶的数量

1. 若桶的数量太少,则桶排序生效

2. 若桶的数量太多,则有的桶可能,没有数据造成空间节约

所以桶的数量由咱们本人来确定,但尽量让元素均匀散布到每一个桶里,这里提供一个形式

(最大值 – 最小值)/ 每个桶所能搁置多少个不同数值 +1

3. 确定桶的区间,个别是依照(最大值 – 最小值)/ 桶的数量来划分的,且左闭右开

public class BucketSort {public static final int[] ARRAY = {35, 23, 48, 9, 16, 24, 5, 11, 32, 17};
    /**
     * @param bucketSize 作为每个桶所能搁置多少个不同数值, 即数值的类型
     *                   例如当 BucketSize== 5 时,该桶能够寄存{1,2,3,4,5}这几种数字,*                   然而容量不限,即能够寄存 100 个 3
     */
    public static List<Integer> sort(List<Integer> array, int bucketSize) {if (array == null || array.size() < 2)
            return array;
        int max = array.get(0), min = array.get(0);
        // 找到最大值最小值
        for (int i = 0; i < array.size(); i++) {if (array.get(i) > max)
                max = array.get(i);
            if (array.get(i) < min)
                min = array.get(i);
        }
        // 获取桶的数量
        int bucketCount = (max - min) / bucketSize + 1;
        // 构建桶,初始化
        List<ArrayList<Integer>> bucketArr = new ArrayList<>(bucketCount);
        List<Integer> resultArr = new ArrayList<>();
        for (int i = 0; i < bucketCount; i++) {bucketArr.add(new ArrayList<>());
        }
        // 将原数组的数据调配到桶中
        for (int i = 0; i < array.size(); i++) {
            // 区间范畴
            bucketArr.get((array.get(i) - min) / bucketSize).add(array.get(i));
        }
        for (int i = 0; i < bucketCount; i++) {if (bucketSize == 1) {for (int j = 0; j < bucketArr.get(i).size(); j++)
                    resultArr.add(bucketArr.get(i).get(j));
            } else {if (bucketCount == 1)
                    bucketSize--;
                // 对桶中的数据再次用桶进行排序
                List<Integer> temp = sort(bucketArr.get(i), bucketSize);
                for (int j = 0; j < temp.size(); j++)
                    resultArr.add(temp.get(j));
            }
        }
        return resultArr;
    }
    public static void print(List<Integer> array) {for (int i : array) {System.out.print(i + " ");
        }
        System.out.println("");
    }
    public static void main(String[] args) {print(Arrays.stream(ARRAY).boxed().collect(Collectors.toList()));
        System.out.println("============================================");
        print(sort(Arrays.stream(ARRAY).boxed().collect(Collectors.toList()), 2));
    }
}

工夫复杂度
桶排序算法遍历了 2 次原始数组,运算量为 2N,最初,遍历桶输入排序后果的运算量为 N,初始化桶的运算量为 M。

对桶进行排序,不同的排序算法算法复杂度不同,冒泡排序算法复杂度为 O(N^2),堆排序、归并排序算法复杂度为 O(NlogN),咱们以排序算法复杂度为 O(NlogN)进行计算,运算量为 N /M log(N/M) M

最终的运算量为 3N+M+N/M log(N/M) M,即 3N+M+N(logN-logM),去掉系数,工夫复杂度为 O(N+M+N(logN-logM))

算法稳定性
桶排序算法在对每个桶进行排序时,若抉择稳固的排序算法,则排序后,雷同元素的地位不会产生扭转,所以桶排序算法是一种稳固的排序算法。

总结
本篇文章就到这里了,心愿能给你带来帮忙

正文完
 0