排序算法之-基数排序
基数排序就是把原列表中的数按位数分割成不同的数字,然后从比较各位的大小来进行排序的方法。基数排序是桶排序的一种。
基数排序有两种排序方式,最低位优先法 LSD (Least significant digital) 和最高位优先法 MSD (Most significant digital),LSD 从最低位到最高位依次按位进行排序,MSD 从最高位向最低位依次按位进行排序。
算法步骤
这里给出 LSD 方式的算法步骤:
- 设 n=1。
- 遍历原列表,把列表中元素按第 n (从右到左) 位的数字大小放到对应桶中。
- 遍历所有桶,按顺序将桶中元素放到已排序列表中。
- 设置 n++,重复步骤 2, 3,直到 n 到最大位。
动图演示
代码示例
#define SORT_OK (0)
#define SORT_ERR (-1)
int radixSort(int* array, int arrLen)
{
if (array == NULL || arrLen < 0)
return SORT_ERR;
int tmp[10][arrLen + 1];
int power = 1;
int max = array[0];
int i = 0;
for (i = 0; i < 10; i++)
tmp[i][0] = 0;
//计算最大位数
i = 0;
while (i < arrLen)
{
if (array[i] > max)
max = array[i];
i++;
}
while (power <= max)
{
//每一位按大小放入对应桶内
for (i = 0; i < arrLen; i++)
{
int tmpValue = array[i] / power;
int index = tmpValue % 10;
tmp[index][++tmp[index][0]] = array[i];
}
//遍历所有桶,按顺序还原数组
int aIndex = 0;
for (i = 0; i < arrLen; i++)
{
for (int j = 1; j <= tmp[i][0]; j++)
array[aIndex++] = tmp[i][j];
tmp[i][0] = 0;
}
//对下一位进行排序
power *= 10;
}
return SORT_OK;
}
- 版权声明: