桶形排序和计数排序十分相似,唯一的区别是桶形排序的输入是随机产生的,换句话说,是均匀分布的。往大了讲,数据越大,到最后每个桶里面的数据的个数都是一样的。
上代码:
#include <stdio.h>
#include <time.h>
#define N 10
#define TYPE float
typedef struct set *Set;
Set newSet();
void setInsert(Set s,float x);
void BucketSort(float a[]);
struct set //定义结构体
{
TYPE data;
Set link;
};
main()
{
int i;
Set s=newSet(); //定义s
float a[N]; //定义数组
srand((unsigned)time(NULL));
printf("对于样本数目N=10的[0,1]上的随机空间:\n");
printf("随机生成数组为:\n");
for(i=0;i<N;i++)
{
a[i]= (float)rand()/32767.0;
printf("%f ",a[i]);
}
printf("\n");
BucketSort(a); //调用桶排序函数
printf("BucketSort结果如下:\n");
for(i=0;i<N;i++) //打印结果
printf("%f ",a[i]);
printf("\n");
getchar(); //调试窗口停留
}
Set newSet() //初始化Set变量
{
Set s=(struct set *)malloc(sizeof(struct set));//分配空间
s->data=0.0; //初始化data
s->link=NULL; //初始化link
return (s);
}
void setInsert(Set s,float x)
{
Set p,q,h;
p=newSet(); //开辟三个变量
q=newSet();
h=newSet();
p=s; //变量转化
q->data=x;
if(s==h) //如果s为空
{
s=q; //赋值 data =x
q->link=NULL;
}
else //s不为空
{
while((q->data>p->data)&&(p->link!=NULL)) //x 比原先的小
{
h=p;
p=p->link; //指向下一个
}
if(q->data<=p->data) //注意经过上面的while循环此处p已经变过了
{
if(s==p) //此时相等s中只有一个s元素 上面中的while循环中h 没有赋值
s=q; //插在前面s后面
else
h->link=q; //q插在 h和p 之间
q->link=p;
}
else
{
p->link=q;
q->link=NULL;
}
}
}
void BucketSort(float a[])
{
int i,k=0,m=0,index=0;
Set p[N];
for(i=0;i<N;i++)
p[i]=newSet(); //重置p 产生桶
for(i=0;i<N;i++)
{
index=(int)(N*a[i]);
setInsert(p[index],a[i]);
}
for(i=0;i<N;i++)
{
if(p[i]!=newSet())
{
p[i]=p[i]->link;
while(p[i])
{
a[k++]=p[i]->data;//最后整理收集
p[i]=p[i]->link;
}
}
}
}