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

基数排序(C语言版本)

2017-07-11 21:44 155 查看
基本思想:将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。

代码:

#include<stdio.h>
#include<windows.h>

int getWidth(int *a,int n)
{
int flag = a[0];
int i;
for(i=1;i<n;i++)
{
if(flag<a[i])
flag = a[i];
}
int time=0;
while(flag>0)
{
flag = flag/10;
time++;
}
return time;
}

/*
*获取一个数第d位数的值,位数索引从0开始
*/
int getValue(int value, int d) {
for (;d > 0 && value > 0; d--) {
value = value /10;
}
return value % 10;
}

//桶操作
void innerCountingSort(int a[], int n, int d)
{
int i,flag,j,k=0;
int b[10];
for(i=0;i<10;i++)
{
b[i] = 0;
}
int **p = (int **)malloc(10*sizeof(int *));
for(i=0;i<10;i++)
{
p[i] = (int *)malloc(n*sizeof(int));
}

for(i = 0; i < n; i++)
{
flag = getValue(a[i], d);
p[flag][b[flag]++] = a[i];
}

for(i=0;i<10;i++)
{
for(j=0;j<b[i];j++)
{
a[k++] = p[i][j];
}
}
for(i=0;i<10;i++)
{
free(p[i]);
}
free(p);

}

//基数排序函数
void radixSort(int a[], int n,int width) {
int i;
for (i = 0; i < width; i++) {
innerCountingSort(a, n, i);
}
}

int main()
{
int a[] = {49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51};
int n= 28;
int i;
for(i=0;i<n;i++)
{
printf("%d\t",a[i]);
}
printf("\n\n");

//确定数组中的最高位
int width;
width = getWidth(a,n);
radixSort(a,n,width);
for(i=0;i<n;i++)
{
printf("%d\t",a[i]);
}
printf("\n");
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息