桶排序
目录
桶排序
-
桶排序就是将最大值和最小值之间的元素进行瓜分,设定某个桶的容量,然后再定义每个桶的跨度,然后根据元素的大小范围,将他们放入各自的桶中,再对每个桶进行排序,最后输出桶即排序完成
-
确定桶的跨度大小:
int gap = (max - min) / array.length + 1;- 就是范围除以个数就是每个里面有多少个了,比如100个苹果,分给5个人,每个人就20个,这个20就是gap跨度
- 这个为什么要加1呢?因为如果8个苹果,分给8个人,则每人1个.而需要的桶的数量为(8-0)/1+1为9个,这样子就有点浪费空间了
- 加上1的话,这样结果为(8-0)/2+1为5个,节省了空间
-
确定桶的个数:
int bucketNum = (max - min) / gap + 1;- 就是范围除以每个有多少个,比如100个苹果,每个桶装20个,那么需要5个桶装,5就是bucketNum
- 为什么要加1呢?如果有总的苹果树换成101个,那么如果每个桶转20个,就会还剩下1个,所以必须加1。加1作用是用来缓冲的,存储剩下的元素,他的跨度不确定
-
复杂度分析:时间复杂度为O(m + n),空间复杂度为O(m + n)。稳定排序,非原地排序
-
代码实现
import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.LinkedList; /** * @Description: 桶排序 * @Author: LinZeLiang * @Date: 2020-10-10 */ public class BucketSort { public static void main(String[] args) { int[] array = {9, 8, 7, 5, 2, 3, 5, 10, 34, 55, 8, 33, 2, 11, 45, 6, 0}; bucketSort(array); System.out.println(Arrays.toString(array)); } private static void bucketSort(int[] array) { //获取最大值和最小值 int max = array[0]; int min = array[0]; for (int i = 1; i < array.length; i++) { if (array[i] > max) { max = array[i]; } if (array[i] < min) { min = array[i]; } } //确定桶的跨度大小 int gap = (max - min) / array.length + 1; //确定桶的个数 int bucketNum = (max - min) / gap + 1; //创建桶 ArrayList<LinkedList<Integer>> bucketList = new ArrayList<>(); //初始化桶 for (int i = 0; i < bucketNum; i++) { bucketList.add(new LinkedList<Integer>()); } //遍历数组,将数据放入桶中 for (int i = 0; i < array.length; i++) { bucketList.get((array[i] - min) / gap).add(array[i]); } //对每个桶内部进行排序 for (int i = 0; i < bucketList.size(); i++) { //底层采用了归并排序的优化版本 Collections.sort(bucketList.get(i)); } //把每个桶排序好的数据进行合并汇总放回原数组 int k = 0; for (int i = 0; i < bucketNum; i++) { for (Integer integer : bucketList.get(i)) { array[k++] = integer; } } } }
我走得很慢,但我从不后退!

浙公网安备 33010602011771号