• 桶排序


    参考资料:算法导论

    note1:桶排序是另外一种以O(n)或者接近O(n)的复杂度排序的算法. 它假设输入的待排序元素是等可能的落在等间隔的值区间内.一个长度为N的数组使用桶排序, 需要长度为N的辅助数组. 等间隔的区间称为桶, 每个桶内落在该区间的元素. 桶排序是基数排序的一种归纳结果

    note2:待排序元素越均匀, 桶排序的效率越高. 均匀意味着每个桶在中间过程中容纳的元素个数都差不多,不会出现特别少或者特别多的情况, 这样在排序子程序进行桶内排序的过程中会达到最优效率.

    note3:将元素通过恰当的映射关系将元素尽量等数量的分到各个桶(值区间)里面, 这个映射关系就是桶排序算法的关键.桶的标记(数组索引Index)的大小也要和值区间有对应关系

    代码:

     1 package sorts;
     2 
     3 import java.util.Arrays;
     4 import java.util.Random;
     5 
     6 class Bucket {
     7     private double data;
     8     private Bucket next;
     9     public double getData() {
    10         return data;
    11     }
    12     public void setData(double data) {
    13         this.data = data;
    14     }
    15     public Bucket getNext() {
    16         return next;
    17     }
    18     public void setNext(Bucket next) {
    19         this.next = next;
    20     }
    21     @Override
    22     public String toString() {
    23         return Double.toString(data);
    24     }
    25 }
    26 
    27 public class BucketSort {
    28     
    29     /**
    30      * Input element MUST be in the range [0, 1). Or
    31      * the program may not function properly.
    32      * */
    33     public static void sort(double[] a) {
    34         // init
    35         Bucket[] buckets = new Bucket[a.length];
    36         int n = a.length;
    37         // sort
    38         for (int i = 0; i < a.length; i++) {
    39             addBucket(buckets, (int)(a[i] * n), a[i]);
    40         }
    41         retrieveBuckets(buckets, a);
    42     }
    43     
    44     private static void retrieveBuckets(Bucket[] buckets, double[] a) {
    45         Bucket iterator = null;
    46         int index = 0;
    47         for (int i = 0; i < buckets.length; i++) {
    48             iterator = buckets[i];
    49             while (iterator!=null) {
    50                 a[index++] = iterator.getData();
    51                 iterator = iterator.getNext();
    52             }
    53         }
    54     }
    55 
    56     // no need for insertion sort
    57     private static void addBucket(Bucket[] buckets, int index, double data) {
    58         Bucket iterator = buckets[index];
    59         if (iterator == null) {
    60             Bucket tmp = new Bucket();
    61             tmp.setData(data);
    62             tmp.setNext(buckets[index]);
    63             buckets[index] = tmp;
    64         } else {
    65             Bucket tmp = new Bucket();
    66             Bucket previous = iterator;
    67             tmp.setData(data);
    68             while ((iterator!=null) && 
    69                     (data > iterator.getData())) {
    70                 previous = iterator;
    71                 iterator = iterator.getNext();
    72             }
    73             if (iterator==previous) {
    74                 tmp.setNext(iterator.getNext());
    75                 iterator.setNext(tmp);
    76             } else {
    77                 previous.setNext(tmp);
    78                 tmp.setNext(iterator);
    79             }
    80         }
    81     }
    82     
    83     // test
    84     public static void main(String[] args) {
    85         Random random = new Random();
    86         int num = 10;
    87         double[] a = new double[num];
    88         for (int i = 0; i < num; i++) {
    89             a[i] = random.nextDouble();
    90         }
    91         BucketSort.sort(a);
    92         System.out.println(Arrays.toString(a));
    93     }
    94     
    95 }
  • 相关阅读:
    [转]boost.bind 如何 bind continue.1
    Maven configure settins.xml
    JUNIT测试通过,EMMA通不过,java.lang.NoClassDefFoundError: oracle/security/pki/OracleWallet
    java中OOA,OOT, OOP, OOD, OOSM,OOM英文表示的含义是什么?
    关于navicat连接oracle 报 ORA12737 set CHS16GBK错误的解决方案
    configure integration Hibernate3,Spring3,Struts2,JPA
    Proguard returned with error code 1. See console
    Spring内置提供的NativeJdbcExtractor转换器
    oracle opreation instruction(表空间,用户etc)
    Struts2,oracle实现GOOGLE的分页样式
  • 原文地址:https://www.cnblogs.com/qrlozte/p/3969973.html
Copyright © 2020-2023  润新知