使用邻接表实现基数排序

使用邻接表实现基数排序可以节省内存使用空间,但是在排序上会有问题,解决的办法就是在分配数组的时候从最后一个数组开始分配,收集的时候从第一个开始收集就可以解决了。

实现代码如下:

注:使用不同的编译器是不一样的,我是在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);
}


 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值