小白懂算法之桶排序

一.桶排序简介

  桶排序是常见排序算法中最快的一种,大多数情况下比快排和归并排序还要快,但是也非常消耗空间,典型的以空间换时间,基本上是最耗内存的一种排序算法。

二.算法原理

  桶排序是需要准备一组空桶,可以用一维数组来代替。空桶的长度是 待排序数组中最大数+1;待排序数组中元素值A放到桶数组的下标为A的位置,元素值B放到桶数组的下标为B的位置,依次类推。但考虑到一个位置上只能存放一个数,所以这个存放的数实际是记录着元素的出现个数。

三.代码实现(Java实现)

    public static void main(String[] args) {
        //创建一个无序数组
        int[] arr = new int[] {2,1,5,3,8,3,19,13,2};
        
        //创建一组空桶,长度为arr中最大数+1
        int[] bucket = new int[20];

        //调用桶排序方法进行排序
        BuckeSort(arr,bucket);
        
        //遍历打印 数组的结果
        for(int i=0;i<arr.length;i++) {
            System.out.print(arr[i]+" ");
        }
        
    }

    private static void BuckeSort(int[] arr, int[] bucket) {
        /**
         *     实现思路:
         *         打个比方:
         *             >arr[0] = 6 ,那bucket[6] 就+1,代表在bucket[6]有一个6了
         *             >如果arr[2] = 6,那bucket[6]就再+1,此时bucket[6] =2,代表存放了两个6
         *             >依次推理
         *         遍历arr,记录元素在对应桶出现的次数
         *         遍历bucket,当bucket的元素>=1,那么该元素的下标值加入到arr中
         */
        
        for(int i=0;i<arr.length;i++) {
            bucket[arr[i]]++;    //arr[i]是作为bucket的下标值
        }
        
        int t=0;    //t记录arr下标
        for(int j=0;j<bucket.length;j++) {    //遍历桶
            for(int k=1;k<=bucket[j];k++) {    //若桶中元素是大于1的
                arr[t++] = j;    
            }
        }
        
    }

 

posted @ 2020-11-17 21:09  爱编程DE文兄  阅读(163)  评论(0编辑  收藏  举报