描述
有一种简单的排序算法叫做计数排序。这种排序算法对一个待排序的表进行排序,并将排序结果存放到另一个新的表中。必须注意的是,表中所有待排序的关键字互不相同,计数排序算法针对表中的每个记录,扫描待排序的表一趟,统计表中有多少个记录的关键字比该记录的关键字小。假设针对某一个记录,统计出的计数值为c,那么,这个记录在新的有序表中的合适的存放位置即为c。请编写算法实现计数排序。
输入
多组数据,每组数据两行。第一行为序列的长度n,第二行为序列的n个元素(元素之间用空格分隔,元素都为正整数)。当n等于0时,输入结束。
输出
每组数据输出一行,为从小到大排序后的序列。每两个元素之间用空格隔开。
输入样例 1
5
4 5 3 2 9
6
1 3 5 7 9 2
0
输出样例 1
2 3 4 5 9 1 2 3 5 7 9
思路:
题目“计数排序”的意思就是把数组从头遍历到尾,看有几个元素比它小,那么反过来讲它就比几个元素大,在新的数组里就排在第几位。比如2 3 4 5 9,对于4来说,有2 3比它小,那么若按下标从0开始算的话,4在新的数组里应排在第三位,就是这个意思。所以可以设置一个计数器cnt来统计在遍历的过程中比它小的元素的个数。
代码如下:
#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
#include<stack>
#include<set>
#include<map>
using namespace std;
vector<int> Sort(vector<int> v)
{
vector<int> ans(v.size());
int cnt = 0;
for (int i = 0; i < v.size(); i++)
{
for (int j = 0; j < v.size(); j++)
{
if (v[j] < v[i])
cnt++;
}
ans[cnt] = v[i];
cnt = 0;
}
return ans;
}
void Show(vector<int> v)
{
for (int i = 0; i < v.size()-1; i++)
cout << v[i] << ' ';
cout << v[v.size() - 1] << endl;
}
int main()
{
int n;
while (cin >> n && n != 0)
{
vector<int> v(n);
for (int i = 0; i < n; i++)
cin >> v[i];
Show(Sort(v));
}
return 0;
}