Loading

桶排序

目录

桶排序

  • 桶排序就是将最大值和最小值之间的元素进行瓜分,设定某个桶的容量,然后再定义每个桶的跨度,然后根据元素的大小范围,将他们放入各自的桶中,再对每个桶进行排序,最后输出桶即排序完成

  • 确定桶的跨度大小: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;
                }
            }
        }
    }
    
posted @ 2020-10-11 02:33  linzeliang  阅读(176)  评论(0)    收藏  举报