基排:又称“桶子法”(bucket sort)。它是透过键值的部份资讯,将要排序的
元素分配
至某些“桶”中,藉以达到排序的作用。比如常见的Base = 10。基数排序法是属于稳定性的排序,其
时间复杂度
为O (nlog(r)m),其中r为所采取的基数,而m为堆数(元素中的最大数)log(r)m为以r为底的对数。在某些时候,基数排序法的效率高于其它的比较性排序法O(nlog(n))。
/***********************************************************************
BASE:基数
m:数组中最大值
原理:依据元素的键值Key作为分类的索引,LSD从低位开始进行排序。BASE=10
即按十进制进行分类,循环次数为以10为底的对数logm。低位排序后再对高位排序。
************************************************************************/
void radixsort(int *a, int n)
{
int i, b[MAX], m = a[0], exp = 1;
for (i = 1; i < n; i++)
{
if (a[i] > m)
m = a[i];//数组中最大值
}
while (m / exp > 0)//exp存储当前排序的位数
{
int bucket[BASE] ={ 0 };
for (i = 0; i < n; i++)
bucket[(a[i] / exp) % BASE]++;//计算桶的index
for (i = 1; i < BASE; i++)
bucket[i] += bucket[i - 1];//前i个桶所有的元素个数
for (i = n - 1; i >= 0; i--)
{
//temp:a[i]在排序后应存放的位置
int temp = --bucket[(a[i] / exp) % BASE];//BASE=10 十进制 按个、十、百、千进行排序。个:个位排好序 小的在前,大的在后 十:对十位重新排列
b[temp] = a[i];
printf("/n%d",temp);
}
for (i = 0; i < n; i++)
a[i] = b[i];
exp *= BASE;
}
}