基数排序
思想:先找出最大数,确定数据的位数,然后依次按个位数计数排序、十位数计数排序、百位数计数排序....直到按所有的位数排序。最后的结果就是排序好的数列。
看一个示例:排序 123,211,321, 145
按个位数排序:211,321,123,145
按十位数排序:211,321,123,145
按百位数排序:123,145,211,321
上述示例是3位数的排序,我们看下比较通用的算法。
void sort(int arr[],int len)
{
int max = arr[0];
for(int i=1;i<len;i++)
{
if(max < arr[i])
max = arr[i];
}
int k = 0;
int *midArray = new int[len];
while(max)
{
int mul = 1;
for(int i=0;i<k;i++)
{
mul *= 10;
}
int countArray[10] = {0};
//求按特定位上的数计数排序的统计数组
for(int i=0;i<len;i++)
{
int g = (arr[i] / mul) % 10;
countArray[g]++;
}
//求按特定位上的数计数排序的累加统计数组
for(int i=1;i<10;i++)
{
countArray[i] = countArray[i] + countArray[i-1];
}
//逆序原有数组
for(int i=len-1;i>=0;i--)
{
int g = (arr[i] / mul) % 10;
midArray[countArray[g]-1] = arr[i];
countArray[g]--;
}
//将中间数组中的数据放入原数组
for(int i=0;i<len;i++)
{
arr[i] = midArray[i];
}
//k是保证能寻址到某个位的辅助变量
k++;
max /= 10;
}
}