前言
流程图:
一、桶排序思想步骤
桶排序:将一组数分成若干份,然后利用数求出每份之间的范围差,然后将在符合范围的数进行插入,因为存在不断地插入数,所以可以使用LinkList和ArrayList链表来进行对桶数的存储和桶内数的存储。
过程:首先找出数中的最大值和最小值,然后求出桶数和间隔数,之后创建链表将桶数存入,将数中的每个数存入到对应的桶内,对每个桶内进行排序,从0号桶开始,将每个桶内排好顺序的数放入到一个新的数组中,最后打印数组即可
桶数计算:(max-min)/数组长度+1
间隔数:(max-min+1)/数组长度
二、代码
代码如下(示例):
void Bucketsort(int a[])
{
int max =a[0];
int min =a[0];
for(int i =0;i<a.length;i++) //求出最大最小值
{
if(a[i]<min)
{
min = a[i];
}
if(a[i]>max)
{
max = a[i];
}
}
//也可以这样写
/*
int max1 = Integer.MAX_VALUE;
int min1 = Integer.MIN_VALUE;
for(int i =0;i<a.length;i++)
{
max1 = Math.max(max1, a[i]);
min1 = Math.min(min1, a[i]);
}
*/
//计算桶的数量
int bucketnum = (max-min)/a.length+1;
int m = (max-min+1)/a.length;//间隔
ArrayList<ArrayList<Integer>> bucket =new ArrayList<ArrayList<Integer>>(bucketnum);
//将每个桶放入到链表中,因为不断插入,所以使用ArrayList
for(int i=0;i<bucketnum;i++)
{
bucket.add(new ArrayList<Integer>());
}
//将每个元素放入桶中
for(int i=0;i<a.length;i++)
{
int num = (a[i]-min)/m;
bucket.get(num).add(a[i]);
}
//对每个桶进行排序
for(int i=0;i<bucket.size();i++)
{
Collections.sort(bucket.get(i));
}
//将桶中的数赋值到原序列
int index =0;
for(int i =0;i<bucket.size();i++)
{
for(int j =0;j<bucket.get(i).size();j++)
{
a[index++] = bucket.get(i).get(j);
}
}
如文章存在错误,请在评论区指出,谢谢观看!