vlambda博客
学习文章列表

算法(7)——桶排序算法

桶排序的基本思想是:把数组 arr 划分为 n 个大小相同子区间(桶),每个子区间各自排序,最后合并 。计数排序是桶排序的一种特殊情况,可以把计数排序当成每个桶里只有一个元素的情况。

1.找出待排序数组中的最大值 max、最小值 min

2.我们使用 动态数组 ArrayList 作为桶,桶里放的元素也用 ArrayList 存储。桶的数量为(max-min)/arr.length+1

3.遍历数组 arr,计算每个元素 arr[i] 放的桶

4.每个桶各自排序

public class BucketSort extends Sort<Integer>{
@Override protected void sort() { // TODO Auto-generated method stub //最大最小值 int max = array[0]; int min = array[0]; int length = array.length/4;
for(int i=1; i<array.length; i++) { if(array[i] > max) { max = array[i]; } else if(array[i] < min) { min = array[i]; } }
//最大值和最小值的差 int diff = max - min;
//桶列表 ArrayList<ArrayList<Integer>> bucketList = new ArrayList<>(); for(int i = 0; i < length; i++){ bucketList.add(new ArrayList<>()); }
//每个桶的存数区间 float section = (float) diff / (float) (length - 1) ;
//数据入桶 for(int i = 0; i < array.length; i++){ //当前数除以区间得出存放桶的位置 减1后得出桶的下标 int num = (int) (array[i] / section) - 1; if(num < 0){ num = 0; } bucketList.get(num).add(array[i]); }
//桶内排序 for(int i = 0; i < bucketList.size(); i++){ //jdk的排序速度当然信得过 Collections.sort(bucketList.get(i)); }
//写入原数组 int index = 0; for(ArrayList<Integer> arrayList : bucketList){ for(int value : arrayList){ array[index] = value; index++; } } }