学这么久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 << " ";
}
}
}
这样,就写好了计数排序的代码,下面是运行效果: