radix sort 不正规的基数排序

在这里插入图片描述
不想用链表就用数组做了,浪费了很多的空间
代码看似很长其实很简单

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int divid(int number, int i);
int arrangeinput(char *initial, int *number);
int main()
{
    char initial[100];
    
    int amount;
    int number[50]={-1};
    int bucket0[20]={-1};
    int bucket1[20]={-1};
    int bucket2[20]={-1};
    int bucket3[20]={-1};
    int bucket4[20]={-1};
    int bucket5[20]={-1};
    int bucket6[20]={-1};
    int bucket7[20]={-1};
    int bucket8[20]={-1};
    int bucket9[20]={-1};
    int pass;
    int remain=0;
    int REMAIN=0;
    scanf("%s,",initial);
    amount=arrangeinput(initial,number);
    //将桶初始化//
    for(int i=0;i<20;i++)
    {
        bucket0[i]=-1;
        bucket1[i]=-1;
        bucket2[i]=-1;
        bucket3[i]=-1;
        bucket4[i]=-1;
        bucket5[i]=-1;
        bucket6[i]=-1;
        bucket7[i]=-1;
        bucket8[i]=-1;
        bucket9[i]=-1;
    }
    
    
    scanf("%d",&pass);
    for(int i=0;i<pass;i++)//进行pass次移动//
    {
        for(int p=0;p<amount;p++)
        {
            remain=divid(number[p],i);
            
            if(remain==0)
            {
                for(int b=0;b<20;b++)
                {
                    if(bucket0[b]==-1)
                    {
                        bucket0[b]=number[p];
                        break;
                    }
                }
            }
            else if(remain==1)
            {
                for(int b=0;b<20;b++)
                {
                    if(bucket1[b]==-1)
                    {
                        bucket1[b]=number[p];
                        break;
                    }
                }
            }
            else if(remain==2)
            {
                for(int b=0;b<20;b++)
                {
                    if(bucket2[b]==-1)
                    {
                        bucket2[b]=number[p];
                        break;
                    }
                }
            }
            else if(remain==3)
            {
                for(int b=0;b<20;b++)
                {
                    if(bucket3[b]==-1)
                    {
                        bucket3[b]=number[p];
                        break;
                    }
                }
            }
            else if(remain==4)
            {
                for(int b=0;b<20;b++)
                {
                    if(bucket4[b]==-1)
                    {
                        bucket4[b]=number[p];
                        break;
                    }
                }
            }
            else if(remain==5)
            {
                for(int b=0;b<20;b++)
                {
                    if(bucket5[b]==-1)
                    {
                        bucket5[b]=number[p];
                        break;
                    }
                }
            }
            else if(remain==6)
            {
                for(int b=0;b<20;b++)
                {
                    if(bucket6[b]==-1)
                    {
                        bucket6[b]=number[p];
                        break;
                    }
                }
            }
            else if(remain==7)
            {
                for(int b=0;b<20;b++)
                {
                    if(bucket7[b]==-1)
                    {
                        bucket7[b]=number[p];
                        break;
                    }
                }
            }
            else if(remain==8)
            {
                for(int b=0;b<20;b++)
                {
                    if(bucket8[b]==-1)
                    {
                        bucket8[b]=number[p];
                        break;
                    }
                }
            }
            else if(remain==9)
            {
                for(int b=0;b<20;b++)
                {
                    if(bucket9[b]==-1)
                    {
                        bucket9[b]=number[p];
                        break;
                    }
                }
            }
        }
        //将原本存储的数据清空//
        for(int q=0;q<amount;q++)
        {
            number[q]=-1;
        }
        int c=0,a=0;
        while(bucket0[c]!=-1)
        {
            number[a]=bucket0[c];
            c++;
            a++;
        }
        c=0;
        while(bucket1[c]!=-1)
        {
            number[a]=bucket1[c];
            c++;
            a++;
        }
        c=0;
        while(bucket2[c]!=-1)
        {
            number[a]=bucket2[c];
            c++;
            a++;
        }
        c=0;
        while(bucket3[c]!=-1)
        {
            number[a]=bucket3[c];
            c++;
            a++;
        }
        c=0;
        while(bucket4[c]!=-1)
        {
            number[a]=bucket4[c];
            c++;
            a++;
        }
        c=0;
        while(bucket5[c]!=-1)
        {
            number[a]=bucket5[c];
            c++;
            a++;
        }
        c=0;
        while(bucket6[c]!=-1)
        {
            number[a]=bucket6[c];
            c++;
            a++;
        }
        c=0;
        while(bucket7[c]!=-1)
        {
            number[a]=bucket7[c];
            c++;
            a++;
        }
        c=0;
        while(bucket8[c]!=-1)
        {
            number[a]=bucket8[c];
            c++;
            a++;
        }
        c=0;
        while(bucket9[c]!=-1)
        {
            number[a]=bucket9[c];
            c++;
            a++;
        }
        c=0;
        //将桶中的数据存储到数组里,再将桶清空用于下一次的radix sort//
        for(int l=0;l<20;l++)
        {
        bucket0[l]=-1;
        bucket1[l]=-1;
        bucket2[l]=-1;
        bucket3[l]=-1;
        bucket4[l]=-1;
        bucket5[l]=-1;
        bucket6[l]=-1;
        bucket7[l]=-1;
        bucket8[l]=-1;
        bucket9[l]=-1;
    }
        
    }
   
    for(int i=0;i<amount;i++)
    {
        printf("%d,",number[i]);
        
    }
    return 0;
}
//返回个位、十位、百位数//
int divid(int number, int i)
{
    int temp;
    int remaindder=0;
    temp=number/(pow(10,i));
    remaindder=temp%10;
    return remaindder;
    
}
//将输入转成整数型存储进去//
int arrangeinput(char *initial, int *number)
{
    int length;
    int amount=0;
    int sum=0;
    int j=0;
    length=strlen(initial);
    for(int i=0;i<length;i++)
    {
        if(initial[i]==',')
        {
            amount++;
        }
    }
    for(int i=0;i<amount;i++)
    {
        if(initial[j]=='\n'||initial[j]=='\0')
        {
            break;
        }
        if(initial[j]==',')
        {
            j++;
        }
        
            while(initial[j]!=','&&initial[j]!='\0')
            {
                sum=sum+initial[j]-'0';
                sum=sum*10;
                j++;
            }
            sum=sum/10;
            number[i]=sum;
            sum=0;
    }
    return amount;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值