桶排序 (Bucket sort)或所谓的箱排序都是一个排序算法。其工作的原理是将数组分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。桶排序是鸽巢排序的一种归纳结果。当要被排序的数组内的数值是均匀分配的时候,桶排序使用线性时间(O(n))。但桶排序并不是 比较排序,他不受到 O(n log n) 下限的影响。
这里将介绍简单的桶排序的算法。桶排序的方式是以数组的形式进行实现的,我们先将被排序的数字作为数组的下标,再进行顺序输出。桶排序耗费的时间短,算法方便简单,但局限性很大,桶排序只能对数字进行排序,最好数字长度相差不大。而无法对含字符的输出进行排序,例如:班级里有5名同学,他们的c语言成绩分别为:zhangsan 85 ;lisi 90 ;zhouwu 78;zhengliu 97;qianqi 88;桶排序无法对按照这五位同学的c语言成绩高低来输出 同学的名字。
以下我们以一道例题并用c语言来展示桶排序。
题目:有100个以内的书本的BISN编码,其中有重复,要求对BISN码进行排序,并输出不重复的BISN编号的数量,且将BISN码由小到达进行输出。
//买书堆排序算法
include<studio.h>
int main()
{
int n,m=0,ISBN[1001];
for(int i=0;i<1001;i++) //数组初始化
{
ISBN[i]=0;
}
scanf("%d",n); //读入书本数量
for(int i=0;i<n;i++) //记录相应ISBN码的书本数量
{
int t;
scanf("%d",&t);
ISBN[t]=ISBN[t]+1;
}
for(int i=0;i<n;i++) //输出应购买书本的ISBN码
{
if(ISBN(i)!=0)
printf("应购买的书的ISBN码:%d",i);
m=m+1; //计算ISBN码不同的书本数量
}
prinf("应购书本数量:%d",m); //输出应购书本数量
return 0;
}
当然,如果我们需要将ISBN码从大到小顺序输出的话只需要将
for(int i=0;i<n;i++) //输出应购买书本的ISBN码
这里的循环条件改成
<pre name="code" class="cpp" style="font-size: 14px; line-height: 24px; text-indent: 28px;">for(int i=n;i>=0;i--) //输出应购买书本的ISBN码