JAVA十大排序算法之桶排序详解

 更新时间:2021年08月23日 10:54:40   作者:阿粤Ayue  
这篇文章主要介绍了java中的桶排序,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

桶排序

桶排序是计数排序的升级,计数排序可以看成每个桶只存储相同元素,而桶排序每个桶存储一定范围的元素,通过函数的某种映射关系,将待排序数组中的元素映射到各个对应的桶中,对每个桶中的元素进行排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序),最后将非空桶中的元素逐个放入原序列中。

桶排序需要尽量保证元素分散均匀,否则当所有数据集中在同一个桶中时,桶排序失效。

image-20210808133137559

代码实现

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))

算法稳定性

桶排序算法在对每个桶进行排序时,若选择稳定的排序算法,则排序后,相同元素的位置不会发生改变,所以桶排序算法是一种稳定的排序算法。

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • 通过代码实例深入解析Java重写和重载

    通过代码实例深入解析Java重写和重载

    这篇文章主要介绍了通过代码实例深入解析Java重写和重载,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • Go Java算法之K个重复字符最长子串详解

    Go Java算法之K个重复字符最长子串详解

    这篇文章主要为大家介绍了Go Java算法之K个重复字符最长子串详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • SpringBoot中实现订单30分钟自动取消的项目实践

    SpringBoot中实现订单30分钟自动取消的项目实践

    现在电子商务平台上订单创建成功,等待支付,一般会给30分钟的时间,本文主要介绍了SpringBoot中实现订单30分钟自动取消的项目实践,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • java多媒体文件编码 处理工具类代码实例

    java多媒体文件编码 处理工具类代码实例

    这篇文章主要介绍了java多媒体文件编码 处理工具类使用解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • java中javamail发送带附件的邮件实现方法

    java中javamail发送带附件的邮件实现方法

    这篇文章主要介绍了java中javamail发送带附件的邮件实现方法,较为详细的分析了JavaMail发送邮件的用法,是非常实用的技巧,需要的朋友可以参考下
    2015-01-01
  • 教你springboot+dubbo快速启动的方法

    教你springboot+dubbo快速启动的方法

    这篇文章主要介绍了springboot+dubbo快速启动的方法,dubbo的角色广泛的分为三类provider,comsumer,注册中心,本文通过实例代码给大家介绍的非常详细,需要的朋友参考下
    2022-04-04
  • Mybatis generator的使用全面解析

    Mybatis generator的使用全面解析

    这篇文章主要介绍了Mybatis generator的使用,非常不错,具有参考借鉴价值,对mybatis generator的使用相关知识感兴趣的朋友一起学习吧
    2016-09-09
  • Java实现四连环棋游戏

    Java实现四连环棋游戏

    这篇文章主要为大家详细介绍了Java实现四连环棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-10-10
  • mybaties plus实体类设置typeHandler不生效的解决

    mybaties plus实体类设置typeHandler不生效的解决

    这篇文章主要介绍了mybaties plus实体类设置typeHandler不生效的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • Spring @Bean注解的使用场景与案例实现

    Spring @Bean注解的使用场景与案例实现

    随着SpringBoot的流行,我们现在更多采用基于注解式的配置从而替换掉了基于XML的配置,所以本篇文章我们主要探讨基于注解的@Bean以及和其他注解的使用
    2023-03-03

最新评论