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

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

桶排序在大数据计算中,运用的比较多,
分组排序的概念,在大数据中随处可见,
其实 mysql 中也有对应的SQL 语句。
所以,如果屏幕前的你,
日后想要学习大数据的话,
建议好好学习学习本篇的桶排序。
算法不难,需要学习的是这种分组(分桶)的思想。
截止本篇,小编一共分享的排序算法包括:
基本涵盖了常用的排序算法,
还有一些,比如基数排序、希尔排序,
等等就来
一、屏幕前的吴彦祖和刘亦菲们,请听题

举个例子:

其实也可以不用写这个题目的哈
稍微多此一举了。
不急,看看下面。
二、解题
桶排序的思想是先分组,再组内排序。
(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 = {10, 8, 11, -9, 1, 1, 2, 5};
bucketSort(arr);
System.out.println(Arrays.toString(arr));
}
}
输出:
D:\java\bin\java.exe
[-9, 1, 1, 2, 5, 8, 10, 11]

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




