声明:码字不易,转载请注明出处,欢迎文章下方讨论交流。
前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督。本文从最简单的一个排序算法——桶排序开始,分析桶排序的实现思路,代码实现,性能特色以及适用场景。java
java数据结构与算法——快速排序
java数据结构与算法——插入排序算法
一个简单例子:
对6我的的英语测试成绩(1~10分)进行排序。假如分数是[6,5,8,8,10,9],用桶排序的思想就是准备10个桶,编号依次为1~10,将成绩放入对应的桶中,例如6分放入6号桶,两个8分放入8号桶...而后按照桶的标号顺序逐一输出(有就输出,没有就不输出),这就是桶排序的基本思想。segmentfault
事实上,这只是一个简易版,试想一下,若是待排序的元素跨度范围比较大,例如1~10000,是否是须要10000个桶?实际上这种状况下,一个桶里并不是总放一个元素,不少时候一个桶里放多个元素。其实真正的桶排序和散列表有同样的原理。数组
实际排序中,一般对每一个桶中的元素继续使用其余排序算法进行排序,因此更多时候,桶排序会结合其余排序算法一块儿使用。数据结构
在分析了桶排序的思想后,首先要知道待排序元素的范围,以上述为例,声明一个长度为10的数组做为10个桶,而后将成绩逐一往桶中放时,该桶的值+1,最终输出倒序输出数组下标,数组每一个位置的值为几就输出几回,这样就能实现基本的桶排序。性能
public class BucketSort { private int[] buckets; private int[] array; public BucketSort(int range,int[] array){ this.buckets = new int[range]; this.array = array; } /*排序*/ public void sort(){ if(array!=null && array.length>1){ for(int i=0;i<array.length;i++){ buckets[array[i]]++; } } } /*排序输出*/ public void sortOut(){ //倒序输出数据 for (int i=buckets.length-1; i>=0; i--){ for(int j=0;j<buckets[i];j++){ System.out.print(i+"\t"); } } } }
测试代码:测试
public class SortTest { public static void main(String[] args) { testBucketsSort(); } private static void testBucketsSort(){ int[] array = {5,7,3,5,4,8,6,4,1,2}; BucketSort bs = new BucketSort(10, array); bs.sort(); bs.sortOut();//输出打印排序 } }
桶排序实际上只须要遍历一遍全部的待排元素,而后依次放入指定的位置。若是加上输出排序的时间,就要遍历全部的桶。所以桶排序的时间复杂度是O(n+m),n是待排元素的个数,m是桶的个数,也就是待排元素的范围。这个算法算是至关快的排序算法了,可是空间复杂度比较大。this
当待排元素的大小范围比较大,但待排元素个数比较少时,空间浪费就比较严重,待排元素分布月均匀,空间利用率越高,事实上这种状况不多见。code
经过以上性能分析,能够得出桶排序的特色:速度快且简单,但同时空间利用率较低。当待排数据跨度很大时,空间利用率是没法忍受的。排序
根据桶排序的特色,桶排序通常适用于一些特定的环境,好比数据范围较为局限或者有一些特定的要求,好比须要经过哈希映射快速获取某些值,须要统计每一个数的数量。可是这一切都以确认数据的范围为前提,若是范围跨度过大,则考虑用其余算法。
java数据结构与算法——快速排序
java数据结构与算法——插入排序
码字不易,如对您有帮助,欢迎点赞收藏打赏^_^