您的位置:首页 > 其它

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

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

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

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

#include <stdio.h>
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)
{
<span style="white-space:pre">				</span>//不知怎么处理
}
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]);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: