#include <stdlib.h>
//基数排序
//如果被排序数组中含有正负混合数,需要先将正负数分开分别排序后再组合
//以十进制基数排序
void Sort(int *arr, int lenth)//这里arr中只有非负数
{
int maxdigit;
int base;
int count[10];
int start[10];
int i;
int index;
int *ptmp = (int *)malloc(lenth*sizeof(int));
//找到最大数
for (maxdigit=0, i=0; i<lenth; i++)
{
if(arr[i] > maxdigit)
maxdigit = arr[i];
}
base = 1;
while(maxdigit/base)
{
for(i=0; i<10; i++)
count[i] = 0;
//统计当前位的数相同的个数
for(i=0; i<lenth; i++)
{
index = (arr[i]/base)%10;
count[index]++;
}
//标记每个位数的起始位置
for(start[0]=0, i=1; i<10; i++)
start[i] = start[i-1]+count[i-1];
//将数据放入桶中
for(i=0; i<lenth; i++)
{
index = (arr[i]/base)%10;
ptmp[start[index]++] = arr[i];
}
//将桶中的数据按顺序重新放回原数组
for (i=0; i<lenth; i++)
{
arr[i] = ptmp[i];
}
base *= 10;
}
free(ptmp);
}
//改进,以8进制(或16进制)为基数排序,这样可以将排序中的乘除运算改为位运算。
void Sort(unsigned int *arr, unsigned int lenth)//这里arr中只有非负数
{
unsigned int maxdigit;
unsigned int base;
unsigned int count[8];
unsigned int start[8];
unsigned int i;
unsigned int index;
unsigned int *ptmp = (unsigned int *)malloc(lenth*sizeof(unsigned int));
//找到最大数
for (maxdigit=0, i=0; i<lenth; i++)
{
if(arr[i] > maxdigit)
maxdigit = arr[i];
}
base = 0;
while(maxdigit>>base)
{
for(i=0; i<8; i++)
count[i] = 0;
//统计当前位的数相同的个数
for(i=0; i<lenth; i++)
{
index = (arr[i]>>base)&0x7;
count[index]++;
}
//标记每个位数的起始位置
for(start[0]=0, i=1; i<8; i++)
start[i] = start[i-1]+count[i-1];
//将数据放入桶中
for(i=0; i<lenth; i++)
{
index = (arr[i]>>base)&0x7;
ptmp[start[index]++] = arr[i];
}
//将桶中的数据按顺序重新放回原数组
for (i=0; i<lenth; i++)
{
arr[i] = ptmp[i];
}
base += 3;
}
free(ptmp);
}