C++信奥之径,锻炼思维,扎实算法——排序算法(2)

C++信奥之径,锻炼思维,扎实算法——排序算法(2)

编码文章call10242025-02-07 16:24:519A+A-


明明的随机数

题目描述

算法解析


根据题意,需要对100个1~1000的数字进行排序与去重。由于数据较小,我们可以使用各种排序算法来排序,并遍历数组,删去重复的数据。

这里介绍3种常用的技巧:

(1)进行计数排序

由于最大数不大于1000,所以可以直接创建1000个桶,将各个数字分别存放到桶中。随后按顺序遍历1000个桶,只要桶中有数字,就输出该值。

由于每个桶只输出一次,就不用去判断数字是否重复出现。下面的示例代码采用的是该算法。

(2)使用unique()函数

在上一篇文章中,解读了题干中的unique()函数,它被包含在头文件中,其功能是将数组中相邻的重复元素去除。并说明了想要实现数组的去重,需要先对数据进行排序。

结合它的特点,我们可以先使用sort()对数组排序,再使用unique()函数去重,得到有序且去重的数组元素个数,最后输出即可。

参考代码如下:

//省略定义数组a[n]和输入
sort(a,a+n); //或sort(a+1,a+n+1)
int t=unique(a,a+n)-a; //或unique(a+1,a+n+1)-(a+1)
//最后输出t和前t个元素


(3)使用STL set容器

利用set容器元素的唯一性与自动排序的特点,直接将数据存储到set中,再输出set的大小与其中的所有元素即可。下方的知识解读会详细介绍该方法。


【参考代码】

#include
using namespace std;
int t[1001];
int main(){
    int n;
    cin>>n;
    for(int i=0;i>a;
        t[a]++;
    }
    int cnt=0;
    for(int i=0;i<1001;i++){
        if(t[i])cnt++;
    }
    cout<


代码中的C++知识解读

STL的set集合

在之前的文章中,曾经介绍过STL里两种好用的容器:

动态数组vector

位图bitset

本期内容,将介绍第三种常用的容器——set集合

set集合

set是C++模板库STL中一个集合类型的容器,使用时要添加头文件#include,实现原理为红黑树。

容器里的元素有3个特点:

(1)唯一性,容器中的每个元素都是唯一的;

(2)已经有序,所有元素会根据其key(键值)自动排序;

(3)由于是集合,因此无法使用下标获取元素,只能通过迭代器来获取。


set容器的初始化与其他两种容器类似,有多种方式:

基本格式:set 容器名; //T为数据类型或类名

set a1; //定义a1集合
set a2{1,2,3,4,5}; //用大括号初始化a2集合的值
Set a3(a2); //拷贝a2来构造a3集合

想要往集合中插入数据,只能使用insert()函数:

a1.insert(10);
a1.insert(15);
a1.insert(10);
//插入已有的数据,会插入失败但是不会报错

下面列出set集合容器常用的函数:

a1.earse(10); //删除某元素,若无目标元素,则不变
a1.size(); //返回容器元素个数
a1.clear(); //清空容器
a1.empty(); //判断容器是否为空
a1.begin(); //获取第一个元素的迭代器
a1.end(); //获取最后一个元素的迭代器
a1.find(10); //获取指向目标元素的迭代器,找不到则返回a1.end()
a1.count(10); //寻找是否存在10,但由于set的特性,只会返回1或0
a1.lower_bound(10); //返回大于等于10的第一个元素的迭代器
a1.upper_bound(10); //返回大于10的第一个元素的迭代器

结合上面的常用函数,如果想要输出某set集合中的全部元素,就需要用到begin()和end()语句。根据是否要一边输出一边清空set,有两种输出的技巧:

示例代码(1):不清空集合的输出

for(auto i=a.begin();i!=a.end();i++){
  //使用auto自动获取类型,就不用记类型名set::iterator了
  cout<<*i<

示例代码(2):清空集合的输出

while(!a.empty()){
    cout<<*a.begin()<

运行结果


结合上面set的介绍,大家应该能够使用该容器来完成本期的题目了吧。

点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4