#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node *next;
}ListNode;
typedef struct Array
{
ListNode Node[10];
int length;
}Array;
Array List;
void InitList()
{
int i;
for(i=0;i<10;i++)
{
List.Node[i].data = i;
List.Node[i].next = NULL;
}
}
int Work(int number,int t)
{
int i,result;
for(i=1;i<=t;i++)
{
result = number % 10;
number /= 10;
}
return result;
}
void Allocate(int *array,int length,int t)
{
int i,k;
ListNode* tmp;
InitList();
for(i=length;i>=1;i--)
{
k = Work(*(array+i),t);
tmp = (ListNode*)malloc(sizeof(ListNode));
tmp->data = *(array+i);
tmp->next = List.Node[k].next;
List.Node[k].next = tmp;
}
}
void Gather(int *array)
{
int i,k=1;
ListNode* tmp;
for(i=0;i<10;i++)
{
tmp = List.Node[i].next;
while(tmp)
{
*(array+k) = tmp->data;
tmp = tmp->next;
k++;
}
}
}
int Find(int *array,int length)
{
int max = -1;
int i,flag=0;
for(i=1;i<=length;i++)
if(*(array+i) > max)max = *(array+i);
while(max)
{
flag++;
max /= 10;
}
return flag;
}
void RadixSort(int *array,int length)
{
int sum,i;
int mark;
mark = Find(array,length);
for(i=1;i<=mark;i++)
{
Allocate(array,length,i);
Gather(array);
}
}
int main()
{
int *array;
int length,i;
scanf("%d",&length);
array = (int *)malloc(sizeof(int)*(length+1));
for(i=1;i<=length;i++)
scanf("%d",array+i);
RadixSort(array,length);
for(i=1;i<=length;i++)
printf("%d ",*(array+i));
return 0;
}
//278 109 63 930 589 184 505 269 8 83
一步一步复习数据结构和算法基础-LSD基数排序
最新推荐文章于 2022-10-22 10:35:35 发布