4027-计数排序(C++,附解析)

描述

有一种简单的排序算法叫做计数排序。这种排序算法对一个待排序的表进行排序,并将排序结果存放到另一个新的表中。必须注意的是,表中所有待排序的关键字互不相同,计数排序算法针对表中的每个记录,扫描待排序的表一趟,统计表中有多少个记录的关键字比该记录的关键字小。假设针对某一个记录,统计出的计数值为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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值