一.思想:
前提:1.待排序序列处于一个可枚举的范围之中。2.可枚举的范围不应该太大,否则开销太大。
首先构建一个Buckets数组,用于记录落入桶内的元素个数,然后,再对Buckets数组进行重新计算,可以得出每个待排序的元素在有序序列中的位置。在这个过程中,需要对每个桶中的若干个元素又进行排序,当然如果这个桶中只有一个元素则不需要。如下面的例子,定义了10个桶,所有每个桶内的元素是一样的,假如定义了2,3个桶,那么则需要在桶内重新排序。
二.例子:
比如5,4,6,6,2,
1.创建长度为num.length的Buckets数组,创建temp数组,把5,4,6,6,2复制到temp数组中。
2.记录落入每个桶中的元素个数,利用Buckets[num[i]]++。比如num[0]=5,那么buckets[5]=1,说明在5号桶中有一个元素,数值为5。再比如num[3]=6,num[4]=6,则buckets[6]=2,说明落入6号桶中的元素有2个,数值为6.其他以此类推。那么最后结果为buckets[2]=1,buckets[4]=1,buckets[5]=1,buckets[6]=2
3.计算每个元素在有序序列中的位置。通过buckets[i]=bucket[i]+buckets[i-1];比如bucket[2],因为buckets[0]和buckets[1]都没有东西,所以说buckets[2]还是等于1,也就是说在有序序列中的第1位,对于buckets[4],buckets[4]=buckets[4]+buckets[3],那么buckets[3]又等于buckets[2],其实就相当于算bucket[4]前面有多少个元素,那么buckets[4]前面只有buckets[2]这一个元素,所以buckets[4]=2,也就是说buckets[4]排在第2位,其他依次类推。
4.知道了每个元素排在多少位,再利用num[--buckets[temp[j]]] = temp[j];把temp数组的元素依次重新放入num数组中,最后就可以完成排序。对于num[--buckets[temp[j]]] = temp[j];最好是拿纸拿笔写出来一步一步理解。
三.实现代码:
public class BucketsSort {
public static void main(String args[])
{
int num[] = {4,3,6,9,5,3,2,3,1};
System.out.print("原始数据:");
print(num);
Bucketsort(num,0,10);
System.out.print("排序后数据:");
print(num);
}
public static void Bucketsort(int num[],int min,int max)
{
int i,j;
int temp[] = new int[max - min];
int buckets[] = new int[max - min];
//记录每个元素在序列中出现的次数
for(i = 0; i < num.length; ++i)
{
buckets[num[i]]++;
}
//计算“落入”桶内的元素在有序序列中的位置
for(i = 1; i < max; ++i)
{
buckets[i] = buckets[i] + buckets[i - 1];
}
//将num[]中的数据完全复制到temp[]数组
System.arraycopy(num, 0, temp, 0, num.length);
//根据buckets数组中的信息将待排序列的各元素放入相应的位置
for(j = num.length - 1; j >= 0; --j)
{
num[--buckets[temp[j]]] = temp[j];
}
}
public static void print(int num[])
{
int i;
for(i = 0; i < num.length; ++i)
{
System.out.print(num[i]+" ");
}
System.out.print("\n");
}
}
四.复杂度和应用:
时间复杂度为:O(n+k) k表示排序数据的范围 空间复杂度为::取决于n(需要创建temp数组)和k(桶的大小)
应用:适用于元素范围不大的情况,也适用于海量计算,比如说高考500万考生,需要考试成绩排序,那么成绩0--750分,就可以定义750个桶。
五.参考资料:
1.追竹的博客:http://blog.csdn.net/apei830/article/details/6596057
2.百度百科-桶排序:http://baike.baidu.com/view/1784217.htm?fr=wordsearch
六:相关排序代码下载:包含(冒泡排序,桶排序,堆排序,插入排序,归并排序,快速排序,基数排序,选择排序,希尔排序)
免积分下载地址: http://download.csdn.net/detail/u014077165/7185895