您的位置:首页 > 编程语言 > C语言/C++

排序【8】之基数排序的C语言实现

2018-01-20 15:10 295 查看
基数排序(Radix Sorting)是一种借助多关键字排序的思想对单逻辑关键字进行关系的方法。基数排序不需要进行记录关键字间的比较。

主要分为两个过程:

(1)分配,先从个位开始,根据位值(0-9)分别放到0~9号桶中(比如53,个位为3,则放入3号桶中)

(2)收集,再将放置在0~9号桶中的数据按顺序放到数组中

基数排序的特点:

稳 定 性:稳定

时间复杂度:O(kn)(k表示整形的最高位)

空间复杂度:O(10n)

举例排序过程:

对 23, 12, 15, 108, 4,5 进行基数排序

1、对个位进行排序

12,23,4,5,15,108

2、对十位进行排序

108,4,5,12,15,23

3、对百位进行排序

4,5,12,15,23, 108

代码:

#include <stdio.h>
#include <stdlib.h>

void RadixCountSort(int *index,int *a,int len)
{
int i;
int *count=(int *)malloc(sizeof(int)*10);

for(i=0;i<10;i++)
{
count[i]=0;
}

for(i=0;i<len;i++)
{
count[index[i]] ++;
}

for(i=1;i<10;i++)
{
count[i]=count[i] + count[i - 1];
}

int *sort=(int *)malloc(sizeof(int)*len);

for(i=len-1;i>=0;i--)
{
count[index[i]] --;
sort[count[index[i]]] = a[i];
}

for(i=0;i<len;i++)
{
a[i]=sort[i];
}

free(sort);
free(count);
}

void RadixSort(int *a,int len)
{
int i , x=1;
int tmp=1;
int *radix=(int *)malloc(sizeof(int)*len);

while(x)
{
tmp=tmp * 10;
x=0;

for(i=0;i<len;i++)
{
radix[i]=a[i] % tmp;
radix[i]=radix[i] / (tmp / 10);
if(a[i] / tmp > 0)
{
x = 1;
}
}

RadixCountSort(radix,a,len);
}
free(radix);
}

int main()
{
int i,len;
int a[]={100, 8 , 1099, 6, 1, 300, 405, 604, 102, 806, 706, 504};
len =sizeof(a) / sizeof(int);

RadixSort(a,len);
for(i=0;i<len;i++)
{
printf("%d ",a[i]);
}
printf("\n");

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息