基数排序
介绍:又称为桶子排序,主要思想是利用数组元素的关键值,将这个数组分布在各个桶里面:先把数组元素个位数相同的放在一个桶里面,然后拿出来,再把十位数相同的放在要给桶里面,再拿出来,直到所有位数都遍历完为止,以数组{23,456,7,12,222,5,999,322,1}为例:
先对数组元素个位数分桶:
桶0:
桶1:1
桶2:12,222,322
桶3:23
桶4:
桶5:5
桶6:456
桶7:7
桶8:
桶9:999
再对十位数分桶:
桶0:1,5,7
桶1:12
桶2:23,222,322
桶3:
桶4:
桶5:456
桶6:
桶7:
桶8:
桶9:999
再对百位数分桶:
桶0:1,5,7,12,23
桶1:
桶2:222
桶3:322
桶4:456
桶5:
桶6:
桶7:
桶8:
桶9:999
最后再将桶中的数字依次放入数组中,即为{1,5,7,12,23,222,322,456,999}
代码实现:
//获取数组中的最高位数
int GetBitSize(int data[],int num)
{
int iCount = 0;
for(int i = 0; i < num;++i)
{
int iTmp = data[i];
int iSize = 0;
while(iTmp)
{
iSize++;
iTmp = iTmp /10;
}
if(iSize >= iCount)
{
iCount = iSize;
}
}
return iCount;
}
//进行排序
void radixSorting(int data[],int num)
{
int iCount = GetBitSize(data,num);
int iBase = 1;
for(int i = 0; i < iCount;++i) //需要循环iCount次
{
int iBucket[10]['n']; //用来保存数的索引,第一个为桶个数,第二个为每个桶中数索引
int iBucketCount[10] = {0};//统计桶中的数的个数
for(int j = 0; j < num;++j)
{
int iLowBit = data[j]/iBase; //从个位开始
int iBaseLow = iLowBit %10;
int k = iBucketCount[iBaseLow]++;
iBucket[iBaseLow][k] = data[j];
}
int b = 0;
for(int k = 0; k < 10;++k)
{
if(iBucketCount[k] > 0)
{
for(int j = 0;j < iBucketCount[k];++j)
{
data[b] = iBucket[k][j]; //依次将桶中元素放入数组中
b++;
}
}
}
iBase = iBase*10;
}
}