基数排序又叫桶排序:
先按照个位数排序,第一次排序好之后;再次按照十位数进行排序,第二次排序好之后;第三次对百位进行排序..................
实现原理图:拿出一些个类似“桶”的东西 将分别按照个位,十位,百位排序好的放到这些“桶”中,然后按照从小到大,从上到下的规则开始取值
排序的次数是该数组中位数最多的元素来决定的 例如下图中排序三次,最高位数是百
相同道理,如果位数最多元素是千的话,那就得排序四次!
如上所示,排序三次之后就完成了该数组的排序!每个桶大家可以想像成一个队列,具有先进先出的特点!
下面进行代码的实现:
首先得求出数组中的最大位数:
static int Get_Figure_Max(int arr[], int len) //获取最大位数count
{
int max = arr[0];
for (int i = 1; i < len; i++)
{
if (arr[i] > max)
{
max = arr[i];
}
}
int count = 0;
while (max != 0)
{
count++;
max /= 10;
}
return count;
}
然后根据传进来index值的不同分别求出个位 十位 百位这些位数上面的数值:
static int Get_Num(int n, int index) //假设传进来(123,2) 传出的值就是1 获取这个数的百位数字
{ //index = 0 获取个位数字的值 index = 1 获取十位数字的值 以此类推
for (int i = 0; i < index; i++)
{
n = n / 10;
}
return n % 10;
}
然后就是根据位数个数和各种位数的数值进行排序的函数:
static void Radix(int arr[], int len, int index) //index是位数
{
int brr[10][20]; //代表0~9号桶 就是上图中的长方形格子就是一个桶 十个桶就 十个数据 列少位给大点 所以就brr[10][20]
int crr[10]; //用crr[i]来代表i号桶中有crr[i]个有效值
for (int i = 0; i < len; i++)
{
int tmp = Get_Num(arr[i],index); //tmp现在存放的就是arr[i]应该放的桶号
brr[tmp][crr[tmp]++] = arr[i]; //前面说过crr[i]代表i号桶中有crr[i]个有效值
// 那么crr[tmp]中就有着tmp号桶中有crr[tmp]个有效值
//初始有效值都是0 有一个有效值就得++
}
int k = 0;
for (int i = 0; i < len; i++) //二维数组 双层for循环
{
for (int j = 0; j < crr[i]; i++)
{
arr[k++] = brr[i][j];
}
}
}
最后来个函数总成 调用上述函数:
void Radix_Sort(int arr[], int len)
{
int count = Get_Figure_Max(arr, len);
for (int i = 0; i < count; i++)
{
Radix(arr,len,i); //i = 0 以个位排序 i = 1 以十位排序 以此类推
}
}
上述被调用的函数前面都有static ,这是因为函数调用函数一般不想被他人所见 static隐藏的作用
最后将函数写在一起:
static int Get_Figure_Max(int arr[], int len) //获取最大位数count
{
int max = arr[0];
for (int i = 1; i < len; i++)
{
if (arr[i] > max)
{
max = arr[i];
}
}
int count = 0;
while (max != 0)
{
count++;
max /= 10;
}
return count;
}
static int Get_Num(int n, int index) //假设传进来(123,2) 传出的值就是1 获取这个数的百位数字
{ //index = 0 获取个位数字的值 index = 1 获取十位数字的值 以此类推
for (int i = 0; i < index; i++)
{
n = n / 10;
}
return n % 10;
}
static void Radix(int arr[], int len, int index) //index是位数
{
int brr[10][20]; //代表0~9号桶 就是上图中的长方形格子就是一个桶 十个桶就 十个数据 列少位给大点 所以就brr[10][20]
int crr[10]; //用crr[i]来代表i号桶中有crr[i]个有效值
for (int i = 0; i < len; i++)
{
int tmp = Get_Num(arr[i],index); //tmp现在存放的就是arr[i]应该放的桶号
brr[tmp][crr[tmp]++] = arr[i]; //前面说过crr[i]代表i号桶中有crr[i]个有效值
// 那么crr[tmp]中就有着tmp号桶中有crr[tmp]个有效值
//初始有效值都是0 有一个有效值就得++
}
int k = 0;
for (int i = 0; i < len; i++) //二维数组 双层for循环
{
for (int j = 0; j < crr[i]; i++)
{
arr[k++] = brr[i][j];
}
}
}
void Radix_Sort(int arr[], int len)
{
int count = Get_Figure_Max(arr, len);
for (int i = 0; i < count; i++)
{
Radix(arr,len,i); //i = 0 以个位排序 i = 1 以十位排序 以此类推
}
}
这玩意思路不难理解,图解也挺简单,代码写起来还不是很简单,主要就是二维数组brr[10][20]中桶中元素的下标crr[]那块难以理解,因为刚开始crr都是零,所以每次使用完之后都得++一下!