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 }