基数排序c++实现

增加空间优化了桶内排序的过程,十进制例子就有十个桶,先个位排序一遍,再十位进桶到最高位时则是排好序的。

int Maxbit(int A[], int n)//求待排序序列最大元素位数
{
	int maxvalue = A[0], digits = 0;//初始化最大元素为A[0],最大位数为0
	for (int i = 1; i < n; i++) //找到序列中最大元素
		if (A[i] > maxvalue)
			maxvalue = A[i];
	while (maxvalue != 0)//分解得到最大元素的位数
	{
		digits++;
		maxvalue /= 10;
	}
	return digits;
}

int Bitnumber(int x, int bit)//求x第bit位上的数字,例如238第2位上的数字为3
{
	int temp = 1;
	for (int i = 1; i < bit; i++)
		temp *= 10;
	return (x / temp) % 10;
}

void RadixSort(int A[], int n)//基数排序
{
	int i, j, k, bit, maxbit;
	maxbit = Maxbit(A, n);//求最大元素位数
	int **B = new int *[10];
	for (i = 0; i < 10; i++)
		B[i] = new int[n + 1];
	for (i = 0; i < 10; i++)
		B[i][0] = 0;//统计第i个桶的元素个数
	//从个位到高位,对不同的位数进行桶排序
	for (bit = 1; bit <= maxbit; bit++)
	{
		for (j = 0; j < n; j++)//分配
		{
			int num = Bitnumber(A[j], bit);//取A[j]第bit位上的数字
			int index = ++B[num][0];
			B[num][index] = A[j];
		}
		for (i = 0, j = 0; i < 10; i++)//收集
		{
			for (k = 1; k <= B[i][0]; k++)
				A[j++] = B[i][k];
			B[i][0] = 0;//收集后元素个数置零
		}
	}
	for (int i = 0; i < 10; i++)
		delete[]B[i];
	delete B;
}
int main() {
	int r[5] = {1,5,3,4,2};
	RadixSort(r, 5);
	for (int i = 0; i < 5; i++)
	{
		cout << r[i] << " ";
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JustEasyCode

谢谢您

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值