基数排序:借助多关键字排序的思想对单逻辑关键字进行排序的方法。
算法实现的思想如图:
算法的实现:
- 先统计数字的位数,记为n
- 每次数组值除10^n得到的结果,就将该数值放在该结果上
- 对所有数据做同样的操作,然后n-1
- 读数据放进数组中,从小往大读,该位置若有多个数据,读取的时候按照先进先出的原则
- 重复上述步骤,直到n = 0为止。
代码实现:
int GexRadixPos(int value, int i)//寻找插入位置
{
int key = 0;
while (i > 0)
{
key = value % 10;
value /= 10;
i--;
}
return key;
}
void Collect(int *arr)//回收
{
int k = 0;
for (int i = 0; i < RADIX; ++i)
{
while (!SlistIsEmpty(&List[i]))
{
arr[k++] = SlistFront(&List[i]);
SlistPopFront(&List[i]);
}
}
}
void Distribute(int *arr, int left, int right, int n)//分发
{
for (int i = left; i < right; ++i)
{
int pos = GexRadixPos(arr[i], n);
SlistPushBack(&List[pos], arr[i]);
}
}
void RadixSort(int *arr, int left, int right)
{
for (int i = 0; i < RADIX; ++i)//初始化
SlistIni(&List[i]);
for (int i = 0; i < K; ++i)
{
Distribute(arr, left, right,i);//分发
Collect(arr);//回收
}
for (int i = 0; i < RADIX; ++i)//摧毁
SlistDestroy(&List[i]);
}