算法导论例程——基数排序

基数排序(radix_sort)可以被称为是计数排序的升级版,他的原理是基于以前的卡片式排序方法,这里把要排序的每个整数看作是一张卡片,把整数的各位数字看作是卡片上的关键字,在进行计数排序时,我们逐位扫描整数的各位数字,并以该数字为关键字进行整体的排序,从低位到高位,在排序时我们可以借助结构体进行辅助,基数排序本身提供思路,它使用的是较为稳定的技术排序作为核心的排序算法,这样保证算法时间复杂度为o(d*(n + k)),其中d为整数的位数。

对于使用计数排序的写法,自己写完后发现,对于位数较低的数字,有个问题就是当他们的某一列都是0时,按照计数排序会把他们按照逆序排列,对于这样的情况,我们应该采用上一次排序是产生的顺序,这就增添了写代码的困难性,之后去查阅资料,看到了这篇文章(点击打开链接)给出的写法,真的是把“基数”体现的淋漓尽致,并且对空间的节约程度很。

以下是自己的代码,对于如何处理还是没想好,先贴上。

#include 
typedef struct radix
{
	int num;
	int base;
	int sort;
}rad;
void radix_sort(rad a[], int length, int d);
int main()
{
	rad a[1000] = { 0 };
	int i = 0, d = 0, n = 0;
	printf("请输入待排序数组的规模:");
	scanf("%d", &n);
	printf("请输入待排序数组中最大数字的位数:");
	scanf("%d", &d);
	while (n--)
	{
		scanf("%d", &a[i].num);
		a[i].sort = i;
		a[i++].base = a[i].num % 10;
	}

	radix_sort(a, i, d);

	return 0;
}

void radix_sort(rad a[], int length, int d)
{
	int b[1000] = { 0 }, c[10] = { 0 }, i = 0, temp = 0;
	while (d--)
	{
		for (i = 0; i < 10; i++)
			c[i] = 0;
		for (i = 0; i < length; i++)
			c[a[i].base] ++;
		for (i = 1; i < 10; i++)
			c[i] += c[i - 1];
		for (i = 0; i < length; i++)
		{
			if (c[a[i].base] - c[a[i].base - 1] > 1)
			{
				//不知怎么处理
			}
			b[c[a[i].base]] = a[i].num;
			c[a[i].base]--;
			temp = a[i].num / 10;
			a[i].base = temp % 10;			
		}
		for (i = 0; i < length; i++)
		{
			a[i].num = b[i + 1];
			a[i].sort = i;
		}
	}
	for (i = 1; i <= length; i++)
		printf("%d,", b[i]);
}


你可能感兴趣的:(算法导论)