基数排序

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
#include<stdio.h>
#include<time.h>
#include<stdlib.h>

#define LENGTH 10

typedef struct Que
{
int *data;
int head;
int tail;
}Que;

void ShowData(int *arr,int len)
{
for(int i = 0;i < len;i++)
{
printf("%d ",arr[i]);
}

printf("\n");

}

//获取width
int GetMaxnum(int *arr,int len)
{
int max = arr[0];
for(int i = 0;i < len;i++)
{
if(arr[i]>max)
{
max = arr[i];
}
}

int width = 0;
while(max)
{
    width++;
    max /= 10;
}
return width;

}

//获取个位,十位,百位…上的数
int GetNumofData(int data,int width)
{
int num = data %10;
while(width)
{
data /= 10;
width–;
num = data %10;
}

return num;

}
//基数排序:时间复杂度:O(d*n) 空间复杂度:n 稳定性:稳定
void RadixSort(int *arr,int len)
{
int width = GetMaxnum(arr,len);

Que que[10];
for(int i = 0;i < 10;i++)
{
    que[i].data=(int *)malloc(sizeof(int) * len);
    que[i].head=que[i].tail=0;
}

//当 i=0,获取个位   i=1,获取十位,i=2,获取百位......
for(int i = 0;i < width;i++)
{
    for(int j = 0;j < len;j++)
    {
        int num = GetNumofData(arr[j],i);
        que[num].data[que[num].tail++] = arr[j];
    }

    int count = 0;
    for(int i = 0;i < 10;i++)
    {
        while(que[i].head != que[i].tail)
        {
             arr[count++] = que[i].data[que[i].head++];
        }           
        que[i].head = que[i].tail = 0;
    }
}

for(int i = 0;i < 10;i++)
{
    free(que[i].data);
}

}

int main()
{
srand((unsigned int)time(NULL));
int arr[LENGTH]={ 0 };
for(int i = 0;i < LENGTH;i++)
{
arr[i] = rand()%10000;
}

ShowData(arr,LENGTH);

RadixSort(arr,LENGTH);

ShowData(arr,LENGTH);

}
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值