算法学习之四:桶排序

来源:互联网 发布:知天气哪个版本好 编辑:程序博客网 时间:2024/06/18 07:59

桶排序概念:

桶排序是在已知数据的范围的条件下,创建若干个桶,根据相应的比较规则将待排数据落入各个对应的桶中,最后扫描桶来实现排序。
这个概念是从http://www.cnblogs.com/hapjin/p/5534262.html摘取的。
桶排序更接近于一种标记,当某个数出现了,就在对应的桶中mark一下。
举例子:
比如一个数组:3 ,5 , 3 , 1 , 2
我们就要准备6个桶:bucket[0] ~bucket[5]。桶中初始数据都为0。
遍历数组,拿到3,就在3号桶中放一根火柴棍,遍历到5,就在5号桶中放一根火柴棍,又遍历到3,就又在3号桶中放一根火柴棍………….

这里写图片描述

用代码实现桶排序:

比如对int[] list = {9,5,12,45,3,5,4,8,22,10,3} 排序

public class BucketSort {    public static int[]  bucketSort(){        int[] list = {9,5,12,45,3,5,4,8,22,10,3};        int [] bucket = new int[46];        //初始化桶中的数据,都为0        for(int i =0;i<bucket.length;i++){            bucket[i] = 0;        }        for(int j =0;j<list.length;j++){            for(int i =0;i<bucket.length;i++){                if(list[j]==i){ //将list中的数据在桶中标记                    bucket[i]++;                    break;                }            }        }        return bucket;    }}

测试:

        int[] list4 = BucketSort.bucketSort();        for(int i = 0;i<list4.length;i++){            //遍历桶中所有数据            if(list4[i]!=0){                Log.e("hxy","i="+i+"  出现次数:"+list4[i]);            }            //查找所有重复的元素:            if(list4[i]>1){                Log.e("hxy","重复元素为:"+i);            }        }

这里写图片描述

总结:

利用桶排序,还可以查找某个元素出现的次数,哪些是重复的元素,关键点是桶排序的时间复杂度是:当有个N个数需要排序,需要准备M个桶,时间复杂是N+M,当M =N的时候,复杂度就是N,这是一种非常快速的排序方法。但是,桶排序在很多情况下都不适用,缘于数据过于离散分布。比如1,5, 1000。对这3个数排序,用桶排序的话,要准备1001个桶,非常占用内存。

0 0
原创粉丝点击