前言
流程图:
一、桶排序思想步骤
桶排序:将一组数分成若干份,然后利用数求出每份之间的范围差,然后将在符合范围的数进行插入,因为存在不断地插入数,所以可以使用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); } }
如文章存在错误,请在评论区指出,谢谢观看!