桶排序算法总结
通过分配和收集的方式进行排序
value/(max+1)*n(这是计算每个元素value应该放入哪个桶里)
算出value应该到哪个桶里面,得出的是
桶的下标
O(N)---O(NlgN) //最好的情况是每个元素分到一个桶里为O(N)
最坏情况是所有元素分到一个桶里,对桶里的元素用快速排序
或者是插入排序则是O(NlgN)的复杂度
k=N/M N个元素,M个桶
O(N+C)
O(N+NlgN-NlgM)(M等于1的时候就是O(N+lgN))
基数排序的过程也是通过分配和收集过程实现排序。
特点,没有负数(有负数的话,做一次转换全部变为正数
,基数排序的桶的个数比较固定为0-9个)
入桶的次数是根据数组的最大值的元素的位数
伪代码如下思路如下:
1.定义一个可变长度的数组ArrayList[]
2.初始化数组
3.求出传入数组的最大元素,根据最大元素确定入桶比较
的次数,个位,十位,百位。。。。,循环进行排序
4,排序的过程是(根据个位入库,分别为9个桶,)
sort(arr)
//准备工作
总共有10个桶,每个桶装的个数不一定,适合用ArrayList
private static ArrayList[] bucket = new ArrayList[10]
//ArrayList[]buffer = new [9] ArrayList;
//静态化代码块初始化桶
static {
for (int i =0; i<bucket.length;i++)
buffer[i] = new ArrayList()
}
arrMax = maxOf(arr)
d=1
dnum=1
while (arrMax/10!=0)
{
dnum++;
arrMax=arrMax/10 //也可以这样max/=10
}
while(d<=dum)
//依据第二个参数进行出桶和入桶。
sort(arr,d++)//d位数。
//基数排序的按照d的位数分配和收集
sort(arr,d)
for (int i = 0; i<arr.size();i++)
pushbucket(arr[i],getDigitOn(arr[i],d)) //入桶操作
第二个参数为数据的第k位的值
//出桶操作(从每个桶中的元素依次压入原数组)
int k = 0;
for(int j=0; j<bucket.length;j++)
for(Object m: bucket[j]) {
arr[k++] = (Integer)m;
}
//桶数据清空
clearAll();
//for (int i=0;i<=9;i++) 思路有问题
//for(int j =0;j<arr.length;j++)
// arr[j] = buffer[i]
void clearAll(){
for (ArrayList b: bucket)
b.clear();
}
pushbubble(data,digitOn)
switch(digitOn)
case 0:
buffer[0].add(data);
break;//注意break的运用
case 1:
buffer[1].add(data)
break;
......
case 9:
buffer[9].add = arr[i]