桶排序

作者: ZhouHaoIsMe | 来源:发表于2020-05-13 15:48 被阅读0次

    桶排序(Bucket Sort) O(n)

    介绍

    桶排序相当与计数排序的升级版,和hash的实现一个原理,桶排序的性能和数据分布情况以及桶个数的设定有很大关系。
    

    算法描述

    • 初始化一些桶(数组),桶里可以添加多个数值(链表)
    • 遍历待排序的序列,得到每个值对应的桶,
    • 添加进桶内,并排序
    • 遍历所有的桶,取出数据,该序列就是有序序列

    动图展示

    bucketSort.gif

    代码实现

    public class BucketSort {
        public static void main(String[] args) {
            int[] arrays = new int[]{27, 6, 27, 42, 23, 15, 38, 50, 35, 14, 40, 28, 29};
            int[] res = bucketSort(arrays);
            print(res);
        }
    
        private static int[] bucketSort(int[] arr) {
            int min = Integer.MAX_VALUE;
            int max = Integer.MIN_VALUE;
            for (int item : arr) {
                min = Math.min(item, min);
                max = Math.max(item, max);
            }
            int bucketSize = 5;
            int bucketCount = Math.floorDiv(max - min, bucketSize) + 1;
            List<List<Integer>> res = new ArrayList<>(bucketCount);
            for (int i = 0; i < bucketCount; i++) {
                res.add(new ArrayList<>());
            }
            for (int value : arr) {
                int bucket = Math.floorDiv(value - min, bucketCount);
                List<Integer> list = res.get(bucket);
                list.add(value);
                list.sort(Integer::compareTo);
            }
    
            int[] result = new int[arr.length];
            int idx = 0;
            for (List<Integer> list : res) {
                for (int i : list) {
                    result[idx++] = i;
                }
            }
            return result;
        }
    
        private static void print(int[] arr) {
            for (int i : arr) {
                System.out.print(i + "\t");
            }
            System.out.println();
        }
    }
    

    相关文章

      网友评论

          本文标题:桶排序

          本文链接:https://www.haomeiwen.com/subject/dognnhtx.html