BucketSort的java实现

桶排序

思想

  • 将所要排序的序列分别映射到N个桶中
  • 然后对每个桶中的元素进行插入排序
  • 最后再将所有桶中的元素连接在一起即可
  • 注意:当我们采用桶排序的前提是:所要排序的序列要满足在某一范围内时均匀分布的,这样才能保证每个桶的元素的个数不会差异太大
package org.wrh.algorithmimplements;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

//桶排序的实现
public class BucketSortImplement {

    public static void main(String[] args) {
        double []a={0.94,0.83,0.79,0.61,0.55,0.46,0.33,0.25,0.12,0.99,0.002,0.854,0.42345};
        System.out.println("排序前的数组元素为:"+Arrays.toString(a));
        bucketSort(a,a.length);
        System.out.println("排序后的数组元素为:"+Arrays.toString(a));

    }

    private static void bucketSort(double[] a, int length) {
        /* * 借助用一个List数组来作为桶 * */
        //List<Double> list[]=new ArrayList<Double>[]();//本想弄一个List数组来解决这个问题,发现不行
        ArrayList<ArrayList<Double>> list=new ArrayList<ArrayList<Double>>() ;
        /* * 注意:这里首先必须得对这些元素进行初始化,才会使得下面得get函数不会有空指向异常 * */
        for(int i=0;i<a.length;i++){
            list.add(new ArrayList<Double>());
        }
        /* * 再将所有的元素放在对应的桶中 * */

        for(int i=0;i<length;i++){
            list.get((int)(a[i]*length)).add(a[i]);

        }
        /* * 将每个桶的元素排序 * */
        for(int i=0;i<length;i++){
            Collections.sort(list.get(i));

        }
        /* * 最后将桶的所有元素合并 * */
        int index=0;
        for(List<Double> arrayList:list){
            for(Double d:arrayList){
                a[index++]=d;
            }

        }
    }

}

上面代码中的注释写的比较详细,这里就不在解释了

总结

  • 桶排序的时间复杂度为:O(n)
  • 但是桶排序所要的额外空间为:O(n)

你可能感兴趣的:(java,Algorithm,BucketSort)