zoukankan      html  css  js  c++  java
  • 桶排序学习笔记

     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 }
  • 相关阅读:
    【转】Windows守护进程的一种简单实现
    vim 文本会在末尾自动添加换行 md5文件和数据只不对应
    指向指针的指针的理解和应用
    TinyXML C++解析XML
    加密解密 AES RSA MD5 SHA
    微信支付 php兼容问题
    sublime text 2 php 语法错误检查
    微信支付宝支付
    MySql安装和基本管理
    验证码处理
  • 原文地址:https://www.cnblogs.com/Grace-is-enough/p/8584071.html
Copyright © 2011-2022 走看看