排序算法--桶排序
9、桶排序(Bucket Sort)
桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。桶排序 (Bucket sort)的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排)。
9.1 算法描述
- 设置一个定量的数组当作空桶;
- 遍历输入数据,并且把数据一个一个放到对应的桶里去;
- 对每个不是空的桶进行排序;
- 从不是空的桶里把排好序的数据拼接起来。
9.2 图片演示
9.3 代码实现
import java.util.ArrayList; /** * @author cai-xiansheng * @Description * @create 2021-01-18 10:45 */ public class BucketSort { public static void bucketSort(int[] arr) { if (arr == null || arr.length < 2) return; int max = arr[0]; int min = arr[0]; for (int i = 1; i < arr.length; i++) { if (arr[i] > max) max = arr[i]; if (arr[i] < min) min = arr[i]; } // 桶的区间 int bucketSize = 10; // 桶的数量:首先是除,那么就得到了整数桶的数量,但是还有一些元素,所以还需要加一个桶 int bucketCount = (max - min) / bucketSize + 1; ArrayList<ArrayList<Integer>> bucketArr = new ArrayList<>(bucketCount); for (int i = 0; i < bucketCount; i++) { bucketArr.add(new ArrayList<Integer>()); } for (int i = 0; i < arr.length; i++) { bucketArr.get((arr[i] - min) / bucketSize).add(arr[i]); } int k = 0; for (int i = 0; i < bucketCount; i++) { int[] tmp = new int[bucketArr.get(i).size()]; for (int j = 0; j < bucketArr.get(i).size(); j++) { tmp[j] = bucketArr.get(i).get(j); } InsertionSort.insertionSort(tmp); for (int j = 0; j < tmp.length; j++) { arr[k] = tmp[j]; k++; } } } }
9.4 算法分析
桶排序最好情况下使用线性时间O(n),桶排序的时间复杂度,取决与对各个桶之间数据进行排序的时间复杂度,因为其它部分的时间复杂度都为O(n)。很显然,桶划分的越小,各个桶之间的数据越少,排序所用的时间也会越少。但相应的空间消耗就会增大。