基数排序

#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
#define MAXE 20		// 线性表中最多的元素个数
#define MAXR 10		// 基数的最大取值
#define MAXD 8		// 关键字位数的最大取值
// 排序数据节点类型
typedef struct node
{
	char data[MAXD];
	struct node * next;
}RecType;

void CreateLink(RecType *&p, char *a[], int n);
void DispLink(RecType *p); 

void RadixSort(RecType *&p, int r, int d)
{
	// 用于分配和收集的队列
	RecType *head[MAXR], *tail[MAXR], *t;
	int i, j, k;
	for(i = 0; i < d; ++ i)
	{
		// 初始化各链队首,尾指针
		for(j = 0; j < r; ++ j)
		{
			head[j] = tail[j] = NULL;
		} 
		// 分配每一个节点
		while(p != NULL)
		{
			k = p->data[i] - '0';
			if(head[k] == NULL)
			{
				head[k] = p;
				tail[k] = p;
			}
			else
			{
				tail[k]->next = p;
				tail[k] = p;
			}
			p = p->next;
		} 
		// 再用p来收集所有节点
		p = NULL;
		for(j = 0; j < r; ++ j)
		{
			if(head[j] != NULL)
			{
				if(p == NULL)
				{
					p = head[j];
					t = tail[j];
				}
				else
				{
					t->next = head[j];
					t = tail[j];
				}
			}
		}
		t->next = NULL; 
		cout << "按" << i << "位排序\t";
		DispLink(p);
	}
}

void CreateLink(RecType *&p, char a[MAXE][MAXD], int n)
{
	RecType *s, *t;
	for(int i = 0; i < n; ++ i)
	{
		s = (RecType *)malloc(sizeof(RecType));
		strcpy(s->data, a[i]);
		if(i == 0)
		{
			p = s;
			t = s;
		}
		else
		{
			t->next = s;
			t = s;
		}
	}
	t->next = NULL;
}

void DispLink(RecType *p)
{
	while(p != NULL)
	{
		cout << p->data[1] << p->data[0] << " ";
		p = p->next;
	}
	cout << endl;
}

int main()
{
	int n = 10, r = 10, d = 2;
	int i, j, k;
	RecType *p;
	char a[MAXE][MAXD];
	int b[] = {75,23,98,44,57,12,29,64,38,82};
	
	for(i = 0; i < n; ++ i)
	{
		k = b[i];
		for(j = 0; j < d; ++ j)
		{
			a[i][j] = k % 10 + '0';
			k = k / 10;
		}
		a[i][j] = '\0';
	}
	
	CreateLink(p, a, n);
	cout << endl;
	cout << "初始关键字\t" << endl;
	DispLink(p);
	RadixSort(p, 10, 2);
	cout << "最终结果\t" << endl;
	DispLink(p);
	cout << endl;
	
	return 0;
} 

  

posted @ 2019-05-29 11:25  青衫客36  阅读(141)  评论(0编辑  收藏  举报