基数排序(基于C语言的实现)
数组实例 9445,83,782,2
按照最末位,放在相应的桶中,得到
0 0 0 0
0 0 0 0
782 2 0 0
83 0 0 0
0 0 0 0
9445 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
782 2 83 9445
再把新得到的序列对下一位在进行相同的操作,循环4次(最大的数字只有4位)
#include <stdio.h>
#include <stdlib.h>
int max(int N[],int n)
{
int max = 0;
for(int i=0; i<n; i++)
{
if (N[i]>max)
max = N[i];
}
return max;
}
//寻找数组中最大的元素
int main()
{
int N[5]= {9445,83,782,2};
int M[5]= {9445,83,782,2};
int n=4,num = max(N,n);//n是数组大小
int temp[10][n];//创建10个桶给每个数位
for(int j=0; num!=0; j++) //循环max位数次
{
int index = 0;
for(int i=0; i<10; i++) //初始化数组
for(int j=0; j<n; j++)
temp[i][j]=0;
int cot[10]= {0}; //cot[x]表示第X号桶中写到了第几位元素
for(int i=0; i<n; i++) //遍历数组
{
temp[N[i]%10][cot[N[i]%10]] = M[i];
cot[N[i]%10]++;
N[i]/=10;
}
// for(int i=0;i<10;i++)
// {
// for(int j=0;j<n;j++)
// {
// printf("%4d ",temp[i][j]);
// }
// printf("\n");
// }
// 输出temp
//将元素恢复到数列
for(int i=0; i<10; i++)
{
for(int k=0; k<n; k++)
{
if (temp[i][k]!=0)
{
M[index] = temp[i][k];
index++;
}
}
}
for(int i=0; i<index; i++)
printf("%4d ",M[i]);
printf("\n");
for(int i=0; i<index; i++)
{
N[i] = M[i]/10;
for(int k=0; k<j; k++)
N[i]/=10;
printf("%4d ",N[i]);
}
printf("\n--------------\n");
num/=10;
}
for(int i=0; i<n; i++)
printf("%d ",M[i]);
return 0;
}