桶排序概念:
桶排序是在已知数据的范围的条件下,创建若干个桶,根据相应的比较规则将待排数据落入各个对应的桶中,最后扫描桶来实现排序。
这个概念是从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个桶,非常占用内存。