工作的原理是将数据按照个位、十位、百位……的顺序(看数据元素中最大的位数),放入桶内,最后依次把各个桶中的记录列出来记得到有序序列。但桶排序并不是比较排序,他不受到O(n log n)下限的影响。
稳定性:稳定排序
时间复杂度:O(n)
适用场景:不用比较,速度很快,但费空间,且桶排序只能适用与数字类型排序;
实现步骤:
1、申请10个桶(数组);
2、把数据按顺序从个位放如桶中;
3、在把桶中的数据,从0开始到倒出来,直到9号倒完;
5、重复2和3,2中的个位要不断上升(个、十、百、千),直至最高位倒完
代码实现
template<class T>
void RadixSort(T *pData, size_t size, size_t databit, bool IsUp = true)
{
int baserate = 1;
T *Tong[10];
int TongIndex[10];
int _tongindex;
int dataindex = 0;
int _daoindex[10];
for (int i = 0; i < 10; ++i)
{
Tong[i] = new T[size];
}
for (size_t sorttime = 0; sorttime < databit; ++sorttime)
{
for (int i = 0; i < 10; ++i)
{
TongIndex[i] = 0;
}
for (size_t i = 0; i < size; ++i)
{
_tongindex = (pData[i] / baserate) % 10;
Tong[_tongindex][TongIndex[_tongindex]++] = pData[i];
}
dataindex = 0;
memset(_daoindex, 0, sizeof(_daoindex));
if (IsUp)
{
for (int t = 0; t < 10; ++t)
{
while (_daoindex[t] < TongIndex[t])
{
pData[dataindex++] = Tong[t][_daoindex[t]++];
}
}
}
else
{
for (int t = 9; t >= 0; --t)
{
while (_daoindex[t] < TongIndex[t])
{
pData[dataindex++] = Tong[t][_daoindex[t]++];
}
}
}
baserate *= 10;
}
for (int i = 0; i < 10; ++i)
{
SAFE_DELARR(Tong[i]);
}
}