【算法】计数排序(c++写的)

学这么久c++了,会排序算法吗?

我们先讲讲思路:

你给我一大堆数字,我要把它们一个个排好序,而且数字还有一大堆是重复的,如果是你,你会怎么排?由于重复的数字很多,所以,我们可以先把相等的数字放在一起,然后把放起来的那几堆俺顺序排好,再把数字一个个摊开,不就排好序了?

知道了思路,就讲一下在代码上怎么实现:

开头先输入整数n,再输入n个要排序的数,计算最大值,以便“摊开”的时候使用。

定义变量:

int n,a[5000],maxn;

输入数据找最大值:

cin >> n;
int b;
for (int i = 1;i <= n;i++)
{
	cin >> b;
	a[b]++;
	maxn = max(maxn,b);
}

输入完数据,就要把它们一个个归好类,比如:4个1放在一堆。把数字存放在数组这个数字的下标的位置。就比如:输入了5,就把下标是5的位置加一。这里用到了数组下标按从小到大顺序的特点。

“数字放一堆”的代码在输入的时候已经处理了,这样可以少写一次循环。

数字按顺序放好后,“摊开”就行了,循环到数组哪个位置的数字非零,就循环输出。例如,下标1的位置数值是5,就输出5个1,这样,就排好序了。“摊开”的代码如下:

for (int i = 0;i <= maxn;i++)
{
	if (a[i] != 0)
	{
		for (int j = 1;j <= a[i];j++)
		{
			cout << i << " ";
		}
	}
}

这样,就写好了计数排序的代码,下面是运行效果:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值