#include<iostream>
typedef struct node
{
int key;
struct node* next;
}keynode;
/***********
struct node
{
int key;
struct node* next;
}
typedef node* keynode;
************/
int BucketSort(vector<int>& nums,int M) //因为本题中并没有给出具体的取值范围,如范围为[100,900],则应给定数组大小为900-100+1=801
{
keynode** buckettable=new keynode*[M]; //创建一个元素为链表的数组,注意到keynode为一个正儿八经的类(CBOX也可以这样使用),因此buckettable为keynode*数组的对象,其中的元素buckettable[i]为链表keynode*的对象
for(int i=0;i<M;++i)
{
buckettable[i]=new keynode*; //因为独立链法的每个桶并不知道多大,故没有给与尺寸
buckettable[i]->key=0;
buckettable[i]->next=nullptr;
}//相当于使用数组进行桶排序时的a[i](0<=i<=M-1)=0;
for(int j=0;j<nums.size();--j)
{
keynode* node=new keynode*; //为大小与nums[j]的元素的链表数组,刚建立时相当于孤立的,并没有与其它序列相连
node->key=nums[j]; //nums[j]为关键码序列的第j个元素,刚建立时key为元素的大小
node->next=nullptr;
int index=nums[j]/10; //散列函数,这里假定只用十位上的数字便可判断大小关系
keynode* p=buckettable[index]; //p指向关键码应归为的位置
if(p->key==0) //即此前没有元素来过(key值还是如初始化的那样)
{
buckettable[index]->next=node; //将其指向主链
(buckettable[index]->key)++; //即key为1
}
else //即之前有重复元素
{
while(p->next!=nullptr) //直到p指向空指针
p=p->next;
p->next=node;
(buckettable[index]->key)++;
}
}
for(int i=0;i<M;++i) //以i遍历元素,此例中即为元素的十位
{
for(keynode* k=buckettable[i]->next;k!=nullptr;k=k->next)
cout<<k->key<<endl;
}
}
正确而简洁的以链表实现的桶排序
最新推荐文章于 2021-05-24 23:01:48 发布