GreensnoWorld
记录点滴,分享乐趣,一块凝固的时间
0061.链式基数排序(Radix Sorting)C语言实例
数据结构与算法  2021年7月24日
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define MAX_NUM_OF_KEY 8
#define RADIX 10
#define MAX_SPACE 1000

typedef int KeysType;
typedef int InfoType;
typedef struct {
	KeysType keys[MAX_NUM_OF_KEY];
	InfoType otheritems;
	int next;
}SLCell;
typedef struct {
	SLCell r[MAX_SPACE];
	int keynum;
	int recnum;
}SLList;
typedef int ArrType[RADIX];

void ListInsert(SLList *L)
{
	int i, n;
	int max;

	printf("Input number of key: ");
	scanf("%d", &(L->keynum));
	if(L->keynum > MAX_NUM_OF_KEY)
		exit(-1);

	L->recnum = 0;
	printf("input key: ");
	scanf("%d", &n);
	max = pow(RADIX, L->keynum);
	while(n>0 && n<max)
	{
		L->recnum++;
		for(i=0; i<L->keynum; i++)
			L->r[L->recnum].keys[i] = (int)(n/pow(RADIX, L->keynum-i-1))%RADIX;
		printf("input key: ");
		scanf("%d", &n);
	}
}

void ListTraverse(SLList L)
{
	int i, k;
	k = L.r[0].next;
	while(k)
	{
		for(i=0; i<L.keynum; i++)
			printf("%d", L.r[k].keys[i]);
		printf(" ");
		k = L.r[k].next;
	}
	printf("\n");
}

void Distribute(SLCell *r, int i, ArrType f, ArrType e)
{
	int j, p;

	for(j=0; j<RADIX; j++)
		f[j] = 0;
	for(p=r[0].next; p; p=r[p].next)
	{
		j = r[p].keys[i];
		if(!f[j])
			f[j] = p;
		else
			r[e[j]].next = p;
		e[j] = p;
	}
}

void Collect(SLCell *r, int i, ArrType f, ArrType e)
{
	int j, t;

	for(j=0; !f[j]; j+=1);
	r[0].next = f[j];
	t = e[j];
	while(j < RADIX)
	{
		for(j+=1; j<RADIX-1 && !f[j]; j+=1);
		if(j<RADIX && f[j])
		{
			r[t].next = f[j];
			t = e[j];
		}
	}
	r[t].next = 0;
}

void RadixSort(SLList *L)
{
	int i;
	ArrType f, e;

	for(i=0; i<L->recnum; i++)
		L->r[i].next = i+1;
	L->r[L->recnum].next = 0;
	for(i=L->keynum-1; i>=0; i--)
	{
		Distribute(L->r, i, f, e);
		Collect(L->r, i, f, e);
	}
}

void main()
{
	SLList L;

	ListInsert(&L);
	RadixSort(&L);
	ListTraverse(L);
}
LIJG
余本顽劣,生于紫云下,长于汝水滨。早年求学,兴趣广泛,好高骛远,学无所成,仓皇入世。兴趣所致,投身互联网,求知未证,而立已至,始悟光阴荏苒,终需务实钻研。故有此站,记录时光,积累点滴,验证所学,分享愚见。指舞方寸间,心系万千年。
留言