diff --git a/桶排序 b/桶排序 new file mode 100644 index 0000000..2c05f70 --- /dev/null +++ b/桶排序 @@ -0,0 +1,66 @@ +#include +#include +//整体思想大致为用数组单元内存放的为结构体式的链表,每个链表称为一个桶。通里面容纳的都是键值相同的元素。 +// 之后便是查看对应元素的键值,然后放进与之对应的桶,还需注意桶为空和不空的时的放入方式 +//桶元素的插入就是看桶以什么方式的实现。这里桶以链表的形式表现,所以桶中元素的插入即为链表中数组的插入。 +/*只要桶的数量够多,那么之前的放入操作只需花费O(n)的时间,而后面的对每个桶里面的元素进行排序则需要基于比较的排序算法。因此后面算法的选择也是 +关乎桶排序速度的重要因素。 + */ +//桶排序的特点是要有界限分明的桶,而不能是无限个桶,也就是说桶排序的个数应该是可以确定的,有限个的。 +//这里链表实现桶排序的还有要注意的点,就是数组的首地址其实链表的头节点,有这里的值确定该桶的元素个数,并由这里出发寻找其他元素。 +typedef struct node *Snode; +typedef struct node{ + int key; + Snode next; +}BBc; + +void sort(int keys[],int keys_size,int bucket_size) +{ + Snode *bucket_table = (Snode *)malloc(bucket_size*sizeof(Snode));//为结构体数组分配空间。 + for(int i=0;ikey = 0; + bucket_table[i]->next = NULL; + }//其实创建数组这部分应该放在主函数那里,否则某些功能只能在这个函数中使用。 + for(int j=0;jkey = keys[j]; + node_branch->next = NULL; + int index = keys[j]/10; + Snode p = bucket_table[index];//p用来充当指向循环的变量。 + //桶为空和非空时的两种插入形式 + if(p->key == 0){ + bucket_table[index]->next = node_branch; + (bucket_table[index]->key)++; + } + //链表的插入形式,按照大小从后到大。 + else{ + while(p->next!=NULL && p->next->key <= node_branch->key){ + p=p->next; + } + node_branch->next = p->next; + p->next = node_branch; + (bucket_table[j]->key)++; + } + } + //以此输出每个桶中的所有元素。 + for(int i=0;inext;k!=NULL;k = k->next){ + printf(" %d ",k->key); + } + } + +} + +int main() +{ + int keys[] = {49,26,53,47,89,31,72,11,33}; + int keys_size = sizeof(keys)/sizeof(int); + int bucket_size = keys_size+2; + sort(keys,keys_size,bucket_size); +}