排序算法之基数排序

基数排序
介绍:又称为桶子排序,主要思想是利用数组元素的关键值,将这个数组分布在各个桶里面:先把数组元素个位数相同的放在一个桶里面,然后拿出来,再把十位数相同的放在要给桶里面,再拿出来,直到所有位数都遍历完为止,以数组{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;
	}
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值