使用邻接表实现基数排序可以节省内存使用空间,但是在排序上会有问题,解决的办法就是在分配数组的时候从最后一个数组开始分配,收集的时候从第一个开始收集就可以解决了。
实现代码如下:
注:使用不同的编译器是不一样的,我是在vc++6.0下编程的,在变量的作用域空间的地方会和其他的编译软件不同。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <time.h>
/***************************************
*根据位来获取位数
****************************************/
int getNum(int num, int pos)
{
int temp=1;
for(int i=0; i<pos-1; i++)
{
temp*=10;
}
return (num/temp)%10;
}
/****************************************
*基数排序
*使用条件比较严格,数据必须要有规律
****************************************/
void main()
{
int n; //数组的个数
int m; //数据位数
printf("请输入数组的个数:\n");
scanf("%d",&n);
printf("请输入数据的位数:\n");
scanf("%d",&m);
//定义结构体
typedef struct node
{
int data;
struct node *next;
}node;
typedef struct character
{
int elem;
struct node *first;
}character;
//初始化特征数组
character b[10];
for(int i=0; i<10; i++)
{
b[i].elem = i;
b[i].first = NULL;
}
//初始化数组
srand(time(0));
int temp;
for(i=1; i<=m; i++)
{
temp*=10;
}
int *a = (int *)malloc(n*sizeof(int));
for(i=0; i<10; i++)
{
a[i] = rand()%temp;
}
//输出排序前的数组
printf("\n输出排序前的数组:\n");
for(i=0; i<n; i++)
{
printf("%d\t",a[i]);
}
//排序
//分配从后往前分
for(i=1; i<=m; i++)
{
for(int j=n-1; j>=0; j--)
{//分配
int index = getNum(a[j],i);
node *temp = (node *)malloc(sizeof(node));
temp->data=a[j];
temp->next = b[index].first;
b[index].first = temp;
}
int count = 0;
for(j=0; j<10; j++)
{//收集
node *temp = (node *)malloc(sizeof(node));
temp = b[j].first;
while(temp != NULL)
{
a[count++] = temp->data;
temp = temp->next;
}
b[j].first=NULL;
}
}
//输出排序后的数组
printf("\n输出排序后的数组:\n");
for(i=0; i<n; i++)
{
printf("%d\t",a[i]);
}
free(a);
}