题目
思路
① 利用C++的集合容器(set)容器来进行储存,然后依次输出即可
对set不熟悉可以点击下面的链接了解
C++ set用法总结(整理)
② 观察到题目给的数据范围并不大,只有1000,在空间充足的情况下可以使用时间复杂度仅为O(n)的基数排序来实现,并且输出的时候再遍历一遍,让对应的不为0的数据输出即可
对基数排序不了解可以点下面的链接
排序算法系列:基数排序
法一(STL set容器)
#include<iostream>
#include<set>
using namespace std;
void positive(set<int>&s)
{
for(set<int>::iterator it = s.begin(); it != s.end(); it++)
{
cout << *it << " ";
}
}
void negative(set<int>&s)
{
for(set<int>::reverse_iterator it = s.rbegin(); it != s.rend(); it++)
{
cout << *it << " ";
}
}
int main()
{
char c;
cin >> c;
set<int> s;
int a;
while(cin >> a)
{
s.insert(a);
}
if(c == 'A')
positive(s);
else if(c == 'D')
negative(s);
}
法二(基数排序/桶排序)
#include<iostream>
#include<cstring>
using namespace std;
//把sort的斜杠去掉并删除掉关于c的判断部分==把重复的部分也输出
void sort(int arr[],int len,char c)
{
int *brr = new int[1000];
memset(brr,0,1000);
int *crr = new int[len];
memset(brr,0,len);
for(int i = 0; i < len; i++)
{
brr[arr[i]] += 1;
}
//int idx = 0;
// for(int i = 0; i < 1000 && idx < len; i++)
// {
// while(brr[i])
// {
// crr[idx++] = i;
// brr[i]--;
// }
// }
if(c == 'A')
{
for(int i = 0; i < 1000; i++)
{
if(brr[i])
cout << i << " ";
}
}
else
{
for(int i = 1000; i >= 0; i--)
{
if(brr[i])
cout << i << " ";
}
}
// for(int i = 0; i < len; i++)
// {
// cout << crr[i]<< " ";
// }
delete[] brr;
delete[] crr;
}
int main()
{
char c;
cin >> c;
int a[10000] = {0};
int len = 0;
int b;
while(cin >> b)
{
a[len++] = b;
}
sort(a,len,c);
return 0;
}