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