目录
前言
基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。
将所有值按照个位,十位,百位...这样子去处理,什么时候停止需要看最大值的位数。
而且被排序序列中的值,位数差异越大,基数排序效率越高。
时间复杂度:O(dn)
空间复杂度:O(dn) d是最大值的位数
稳定性:稳定
一、排序规则
基数排序(桶排序),就是将所有值的每个位值进行排序,最后使整体有序。
我们一样先设立一组值:{8 7 11 120 3 39 21 9 100 99};
二、代码实现
代码的实现和其中思想较为简单,但因为需要封装多个基础函数,所以显得代码较长。
//获取数组中最大值的位数
int Get_figure(int arr[], int len)
{
//assert
int max = arr[0];
for (int i = 0; i < len; i++)
{
if (arr[i] > max)
{
max = arr[i];
}
}
int count = 0;
while (max != 0)
{
count++;
max /= 10;
}
return count;
}
//获取某个值fig位的值
int Get_num(int n, int fig)
{
for (int i = 0; i < fig; i++)
{
n /= 10;
}
return n % 10;
}
void Radix(int arr[], int len, int fig)
{
int bucket[10][20] = { 0 };//十个桶 可以用队列
int bucket_num[10] = { 0 };//每个桶内的有效个数(插入位置)
//从前向后向桶里面放
for (int i = 0; i < len; i++)
{
int index = Get_num(arr[i], fig);
bucket[index][bucket_num[index]] = arr[i];
bucket_num[index]++;
}
//从前向后向桶里面取
int k = 0; //代表原先数组arr的下标
for (int i = 0; i <= 9; i++)
{
for (int j = 0; j < bucket_num[i]; j++)
{
arr[k++] = bucket[i][j];
}
}
}
void RadixSort(int* arr, int len)
{
assert(arr != NULL);
//这个函数控制跑几次, 跑几次通过最大值的位数来判定
int count = Get_figure(arr, len);
for (int i = 0; i < count; i++)
{
Radix(arr, len, i);
}
}
总结
以上就是今天要学习的内容,本文介绍了基数排序的排序规则和代码实现,其思想较为简单,当数据中各值差异较大时,使用该排序方法较为方便。