1 package 算法.排序; 2 3 import java.util.Arrays; 4 5 public class BucketSort { 6 public static void main(String[] args) { 7 // 第一种简单的桶排序(特殊的桶排序,更像是一种计数类的排序) 8 // 其概念简单的说,就是找出一组要排序的数据的最大值x 9 // 然后以此两个数据为界限,做一个长度为x+1的数组 10 // 我们知道,数组的下标照此就是从0至x,所以这里这个 11 // 数组的下标就代表了我们要排序的所有数据了,然后我 12 // 们以此将数据对应的位置加1,最后根据每个位置统计的 13 // 数量输出相应的次数,排序就完成了 14 //-------例子如下:-------- 15 int a[] = {10,5,8,5,3,6,7,1,6}; 16 int aMaxValue = 10; 17 int b[] = new int[aMaxValue+1]; 18 for (int i =0;i<a.length;i++) { 19 b[a[i]]+=1; 20 } 21 System.out.println("--第一种桶排序例子的结果--"); 22 for (int i=0;i<b.length;i++) { 23 for (int j = 0;j<b[i];j++) { 24 System.out.print(i); 25 System.out.print(" "); 26 } 27 } 28 System.out.println(""); 29 // 上述结果为: 1 3 5 5 6 6 7 8 10 30 // 上述的时间复杂度可以说是O(2n)差不多,速度很快, 31 // 但是优缺点也很明显了,针对于数据少,同时最大值 32 // 也比较小的情况下,这种方式很实用。反之,空间的 33 // 使用率就变得非常的高,消耗空间的成本就会变大。 34 35 // 第二种桶排序,相较于上面这种,应该说更为正统一点, 36 // 其实桶排序所做的操作并没有什么特别独到的地方,它 37 // 所要帮我们实现的操作就是将数据拆分成一小块一小块, 38 // 然后再对每一个小块进行排序,而后将每个小块的结果 39 // 统计起来,也就是说桶排序其实采用分治,将要排序的 40 // 数据根据某种特定的规则拆分开来,然后分而治之。 41 int c[] = new int[]{5,12,25,7,15,2,25,13,21}; 42 // 我划分三个桶的大值范围出来:分别为1-10,10-20,20-30 43 // 每个桶能装下30个数据 44 int d[][] = new int[3][30]; 45 for (int i = 0;i < c.length;i++) { 46 int ps = c[i]/10; 47 int innerps = c[i]%10; 48 d[ps][innerps] += 1; 49 } 50 System.out.println("--第二种桶排序例子的结果--"); 51 for (int i = 0;i<d.length;i++) { 52 for (int j = 0; j<d[i].length;j++) { 53 for (int z = 0; z<d[i][j];z++) { 54 System.out.print(i*10+j); 55 System.out.print(" "); 56 } 57 } 58 } 59 // 上述结果为: 2 5 7 12 13 15 21 25 25 60 // 当中我在每个桶的内部重新使用了我们第一种简单的桶排序 61 // 来进行数据排序,当然这里并没什么要求,我们第二种的桶 62 // 排序的最终目的就是分治,帮我们把一大块的数据拆分成一 63 // 小块的数据,然后再用我们认为合适的排序算法对每个小块 64 // 进行排序就可以了。 65 // 综上,桶排序是一个利用空间来换取时间的方式,在我所举 66 // 的例子中也可以看出,桶排序有别于我们前面讲过的冒泡, 67 // 选择,插入等排序的算法,因为前面的算法都会进行数据的 68 // 比较,但是在桶排序中并没有,它一般只作为方便我们进行 69 // 数据比较操作的工具,当然,如果在数据量不大,同时空间 70 // 资源可观的情况下,就像我第二种举得例子一样直接使用桶 71 // 排序来实现数据排序也是可以的,但是一般桶排序的使用都 72 // 是结合其他排序使用的。 73 // 同时,不得不说明一点,当桶排序和其他排序算法结合起来 74 // 的时候,我们其实可以想象,一个数据集,如果桶排序和不 75 // 同的排序算法相互结合使用的时候,结合的算法不同,那么 76 // 相较于计算的速度来说也是不同的,所以说,桶排序是一个 77 // 不稳定的排序算法,它有赖于开发者的设计。 78 } 79 }