桶形排序

桶形排序和计数排序十分相似,唯一的区别是桶形排序的输入是随机产生的,换句话说,是均匀分布的。往大了讲,数据越大,到最后每个桶里面的数据的个数都是一样的。

上代码:

 

#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;
			}
		}
	}
}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值