(radix sort)则是属于“分配式排序”(distribution sort),基数排序法又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的比较性排序法。
基数排序的方式可以采用LSD(Least significant digital)或MSD(Most significant digital),LSD的排序方式由键值的最右边开始,而MSD则相反,由键值的最左边开始。
时间效率:设待排序列为n个记录,d个关键码,关键码的取值范围为radix,则进行链式基数排序的时间复杂度为O(d(n+radix)),其中,一趟分配时间复杂度为O(n),一趟收集时间复杂度为O(n),共进行d趟分配和收集。
以下是针对于整数的基数排序算法实现:
void radix_sort(vector<int>& number)
{
vector< vector<int> > temp(10);//temp用来作为存放中间结果的数据结构
bool overflag = false;//标志排序是否结束
int k = 0;//表示目前排序的位数,从低位开始
while (!overflag)
{
overflag = true;
for (int i = 0;i < number.size();i++)
{
int radix = (number[i] / ((int)pow((double)10,k))) % 10;//获取目前排序位数的数值
temp[radix].push_back(number[i]);
if (overflag && (number[i] / ((int)pow((double)10,k+1)) != 0))//判断当前位数是否是该数的最高位
{
overflag = false;
}
}
k++;
number.clear();
for (int i = 0;i < 10;i++)
{
for (int j = 0;j < temp[i].size();j++)
number.push_back(temp[i][j]);
}
for (int i = 0;i < 10;i++)
temp[i].clear();
}
}
对于含有字符的字符串可使用相同的方法进行,只需要对存储空间的大小进行改变,能够存储所有可能的字符即可.