要对n个数进行排序,就要准备n个桶。先对n个数归一化,就是把它们除以一个较大的数,使之分布在【0,1)之间,然后对每个桶中的数插入排序,最后合并n个桶。时间复杂度为O(n)。
#include <string.h>
#include <time.h>
typedef struct _Node
{
double value;
struct _Node *next;
}Node;
#define BUFFER_SIZE 10
void InsertionSort(Node *a,int len)
{
double b[len];
int i=0;
int j=0;
Node *p=a;//保存指针
if(a==NULL||a->next==NULL)
{
return;
}
a=a->next;
b[0]=a->value;
while(a->next!=NULL)
{
j++;
i=j-1;
while(i>=0&&b[i]>=a->next->value)
{
b[i+1]=b[i];
i--;
}
b[i+1]=a->next->value;
a=a->next;
}
a=p;
i=0;
while(a->next!=NULL)
{
a->next->value=b[i++];
a=a->next;
}
}
void BucketSort(double *a,int len)
{
int i=0;
int j=0;
Node b[len];
Node *tmp=NULL;
Node *p=NULL;
int index=0;
for(i=0;i<len;i++)
{
b[i].next=NULL;
}
for(i=0;i<len;i++)
{
tmp=(Node*)malloc(sizeof(Node));
tmp->value=a[i];
tmp->next=NULL;
index=(int)(len*a[i]);
tmp->next=b[index].next;
b[index].next=tmp;
}
//对每个桶中的链表进行插入排序
for(i=0;i<len;i++)
{
InsertionSort(&b[i],len);
}
//合并各个桶
for(i=0,j=0;i<len;i++)
{
p=b[i].next;
while(p!=NULL)
{
a[j++]=p->value;
p=p->next;
}
}
//释放堆内存
for(i=0;i<len;i++)
{
tmp=b[i].next;
while(tmp!=NULL)
{
p=tmp->next;
free(tmp);
tmp=p;
}
}
}
int main()
{
int i=0;
double a[BUFFER_SIZE];
printf("待排序数组:\n");
srand((unsigned)time(NULL));
for(i=0;i<BUFFER_SIZE;i++)
{
a[i]=(rand()%100)*1.0/100;//归一化
printf("%.2f ",a[i]);
}
printf("\n");
BucketSort(a,BUFFER_SIZE);
printf("对数组进行桶排序:\n");
for(i=0;i<BUFFER_SIZE;i++)
{
printf("%.2f ",a[i]);
}
system("pause");
return 0;
}