桶排序学习笔记

 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 }
posted @ 2018-03-16 18:50  蒙恩少年  阅读(154)  评论(0编辑  收藏  举报