1.基数是什么?
基数排序(radix sort)属于“分配式排序”(distribution sort),顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。
2.描述
基数排序算法的原理如下:
- 遍历序列,取出权重因子的最大长度(若为字符串,则radix=字符串最大长度)。
- 按照权重因子的优先级进行排序。
- 将步骤2中排序的数组放入原数组。
- 权重因子+1,重复步骤2-3,直到权重因子使用完毕。
3.示例
/*
* 基数排序 用于取得整数最大值的位数
*/
int getMaxValueBit(int arrs[], int length) {
int bit = 0;
int max = arrs[0];
for (int i = 1; i < length; i++) {
if (arrs[i] > max) max = arrs[i];
}
while (max) {
max = max / 10;
bit++;
}
return bit;
}
// 基数排序
void radixSort(int arrs[], int length) {
int loop = getMaxValueBit(arrs, length); // 权重因子长度
int radix = 1; // 计算整数权重因子
int count[10] = {0}; // 桶
int *result = new int[length];
for (int i = 0; i < loop; i++) {
memset(count, 0, sizeof(count));
for (int j = 0; j < length; j++)
count[(arrs[j] / radix) % 10]++; // 统计个/十/百/……位相同的数据
// --count[(arrs[j] / radix) % 10]存储arrs[j]在顺序列表中的位置
for (int j = 1; j < 10; j++) count[j] += count[j - 1];
// 将个(十,百,……)位相同的数据从小到大排序
for (int j = length - 1; j >= 0; j--)
result[--count[(arrs[j] / radix) % 10]] = arrs[j];
memcpy(arrs, result, sizeof(int) * length);
radix = radix * 10;
}
if (result != NULL) delete[] result;
}