/*桶排序——最多两位数*/
/*申请和分配每个桶的空间,将数组插入桶中,本程序为每个数除以10,即每个桶内进行个位排序,之后按顺序从每个桶内把数据取出排列到数组内*/
#include <stdio.h>
#include <stdlib.h>
#define bucket_size 15//有多少个桶 15可以最大排到150
typedef struct node
{
int key;
struct node *next;
}keynode;
int bucket_sort(int s[],int size)
{
/*申请空间*/
keynode *bucket_table = (keynode*) malloc(sizeof(keynode)*size);
/*创建桶*/
int i;
for(i=0;i<bucket_size;i++)
{
/*每个桶的元素的空间分配*/
bucket_table[i]=*(keynode*)malloc(sizeof(keynode));
bucket_table[i].key=0;
bucket_table[i].next= NULL;
}
/*开始向桶插入元素*/
for(i=0;i<size;i++)
{
/*给每个数组元素申请空间*/
keynode *node =(keynode*)malloc(sizeof(keynode));
/*给每个节点赋值*/
node->key=s[i];
node->next=NULL;
int bucket_number= s[i]/10;
keynode *p=&bucket_table[bucket_number];
/*桶里没有任何元素*/
if(p->next== NULL && p->key==0)/*个位数*/
{
bucket_table[bucket_number].next =node;
(bucket_table[bucket_number].key)++;
}
/*桶里已有元素,要通过比较插入*/
else
{
while(p->next!=NULL && p->next->key <= node->key)
{
p=p->next;
(bucket_table[bucket_number].key)++;
}
node->next=p->next;
p->next=node;
}
}
int num=0;
keynode *k=&bucket_table[num];
for(i=0;i<size;i++)
{
if(k->next==NULL)
{
num++;
i--;
*k=bucket_table[num];
}
else
{
s[i]=k->next->key;
k=k->next;
}
}
return *s;
}
int main()
{
int s[5];
int n,i;
n=5;
for(i=0;i<n;i++)
{
scanf("%d",&s[i]);
}
bucket_sort(s,n);
for(i=0;i<n;i++)
{
printf("%d ",s[i]);
}
}
经典排序——桶排序——C语言版
最新推荐文章于 2024-02-26 09:50:31 发布