暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

数据结构和算法【90】桶排序

皮皮克克 2023-12-04
109

点击关注公众号,干货第一时间送达


再给诸位演示一种排序算法,

桶排序。

桶排序在大数据计算中,运用的比较多,

分组排序的概念,在大数据中随处可见,

其实 mysql 中也有对应的SQL 语句。

所以,如果屏幕前的你,

日后想要学习大数据的话,

建议好好学习学习本篇的桶排序。

算法不难,需要学习的是这种分组(分桶)的思想。

截止本篇,小编一共分享的排序算法包括:

数据结构和算法【73】快速排序(快排)

数据结构和算法【71】冒泡排序 & 选择排序 & 插入排序

数据结构和算法【38】堆排序

数据结构和算法【37】归并排序

基本涵盖了常用的排序算法,

还有一些,比如基数排序、希尔排序,

等等就来


一、屏幕前的吴彦祖和刘亦菲们,请听题


举个例子:


其实也可以不用写这个题目的哈

稍微多此一举了。

不急,看看下面。


二、解题

桶排序的思想是先分组,再组内排序

(1)分组前,需要先找到原数据最大值max,和最小值min

这个遍历一遍数据即可:

(2)再利用max 和 min 确定每个桶中数据大小范围,和可以划分的桶个数

因为需要尽可能把数据分散在每个桶中,并且保证至少有一个桶,

所以 size = (max - min) N +1。

而要保证每个桶至少能装一个数,所以 bucekts 的求解类似。


(3)创建各个桶,然后把数据放到对应的桶中

就是这样:


最后,把每个桶内部进行排序即可,这个排序可以使用库函数,

或者自己写个快排等算法,都能实现。

按照顺序,把每个桶内部的数据取出来,

就是想要的结果了。

看看代码。



完整代码:

public class CodingDemo_03 {

     /**
     * 桶排序
     * @param arr
     */

    private static void bucketSort(int[] arr){
        if (arr == null || arr.length == 0){
            return;
        }

        //1, 获取数据最大值和最小值
        int max = Integer.MIN_VALUE;
        int min = Integer.MAX_VALUE;
        for (int i = 0; i < arr.length; i++) {
            max = Math.max(max, arr[i]);
            min = Math.min(min, arr[i]);
        }

        //2, 计算数组元素划分,每个桶中元素范围
        int size = (max - min)/arr.length +1;
        int buckets = (max - min)/size +1;

        //3, 初始化桶
        List<List<Integer>> bucketList = new ArrayList<>();
        for (int i = 0; i < buckets; i++) {
            bucketList.add(new ArrayList<>());
        }

        //4, 把元素放入对应桶中
        for (int i = 0; i < arr.length; i++) {
            int num = (arr[i] - min)/size;
            bucketList.get(num).add(arr[i]);
        }

        //5,每个桶内部排序
        for (int i = 0; i < buckets; i++) {
            bucketList.get(i).sort(null); //null 指默认正序排列
        }

        //6,结果返回
        int index = 0;
        for (int i = 0; i < buckets; i++) {
            for (int j = 0; j < bucketList.get(i).size(); j++) {
                arr[index++] = bucketList.get(i).get(j);
            }
        }
    }

    public static void main(String[] args) {

        int[] arr = {10811, -91125};
        bucketSort(arr);
        System.out.println(Arrays.toString(arr));
    }
}

输出:

D:\java\bin\java.exe
[-9112581011]



结束语:
Ok,就是本篇文章的全部内容了。
如果各位有不懂的地方,欢迎发消息给小编,小编会进行详细地解答。
最后,请屏幕前的各位吴彦祖和刘亦菲们,动动你们的小手,给小编一个

文章转载自皮皮克克,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论