正确而简洁的以链表实现的桶排序

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值