菜鸡笔记之——基数排序
基数排序:
先按照每一个元素的个位的大小对所有数进行排序,再按照每一个元素的十位的大小进行排序,以此类推,直到最高位。
参考文章
代码实现(基数排序):
# include <stdio.h>
# include <malloc.h>
# include <string.h>
# include <math.h>
int main(void)
{
int N;
printf("the length of the array:");
scanf("%d",&N);
int * array = NULL;
array = (int *)malloc(sizeof(int)*N);
if (array==NULL)
{
printf("error!\n");
exit(-1);
}
//输入
for (int i = 0;i<N;i++)
{
scanf("%d",array+i);
}
//排序
void radixsort(int *,int);
radixsort(array,N);
//输出
void display(int *,int);
display(array,N);
free(array);
return 0;
}
//取一个数的第pos位
int Getpos(int num,int pos)
{
int bit = (num/(int)(pow(10,pos-1)))%10;
return bit;
}
//数组中元素的最大位数
int Maxbit(int * array,int N)
{
int max = *(array+0);
for (int i = 0;i<N;i++)
{
if (max<*(array+i))
{
max = *(array+i);
}
}
int bitnum = 0;
while (max)
{
bitnum++;
max/=10;
}
return bitnum;
}
//基数排序
void radixsort(int * array,int N)
{
int * bucket[10]; //定义一个指针数组,用于在统计时存放数据(相当于矩阵)
int i,j,pos;
for (i = 0;i<10;i++)
{
bucket[i] = (int *)malloc(sizeof(int)*(N+1)); //bucket[i][0]用于记录该行有多少个数
}
int maxbitnum = Maxbit(array,N); //待排序数组中元素的最长位数
for (pos = 1;pos<=maxbitnum;pos++) //从各位开始到最长位数maxbitnum
{
int index = 0,k = 0; //index为索引当下该位的数的值,k为辅助循环变量
for (i = 0;i<10;i++) //每当要使用bucket时都要对其初始化
{
memset(bucket[i],0,sizeof(int)*(N+1));
}
for (i = 0;i<N;i++) //统计(将数取出放至bucket)
{
int posnum = Getpos(*(array+i),pos);
index = ++bucket[posnum][0];
bucket[posnum][index] = *(array+i);
}
for (i = 0;i<10;i++) //将bucket中的数重新放回,类似于桶排序时的数据收回
{
for (j = 1;j<=bucket[i][0];j++)
{
*(array+k++) = bucket[i][j];
}
}
}
for (i = 0;i<10;i++) //释放申请的内存空间
{
free(bucket[i]);
}
}
void display(int * array,int N) //打印排序后的结果
{
for (int i = 0;i<N;i++)
{
printf("%d\t",*(array+i));
}
}