赞
踩
目录
Sort(start,end,cmp)
(1)start表示要排序数组的起始地址;
(2)end表示数组结束地址的下一位;
(3)cmp用于规定排序的方法,可不填,默认升序。
sort函数用于C++中,对给定区间所有元素进行排序,默认为升序,也可进行降序排序。
一般是直接对数组进行排序,例如对数组a[10]排序,sort(a,a+10)。而sort函数的强大之处在可与cmp函数结合使用,即自定义排序:如果你想按照特定的顺序排序,可以传递一个自定义的比较函数或lambda表达式给sort()。这个函数应该接受两个参数,并返回一个布尔值,指示第一个参数是否应该在排序后位于第二个参数之前。
相对于普通的排序算法,sort()函数在快速排序(详见C++快速排序)的基础上,又进行了优化,时间复杂度为n*log2(n),执行效率较高。
sort()函数适用于数组和提供了随机访问迭代器的大多数STL容器,如vector、deque等。对于不支持随机访问迭代器的容器(如list、forward_list),应使用list容器自己的sort()成员函数。
- int main()
- {
- //sort(起始地址, 结束地址的下一位, *比较函数);
- // 迭代器begin() end() 默认用小于号<
- int a[1000];
-
- int n;
- //读取数组大小
- cin >> n;
- //读取数组元素
- for (int i = 1; i <= n; ++i)cin >> a[i];
- //对数组进行排序
- sort(a + 1, a + n + 1);
- // a[1] a[n+1] [1,n+1) 左闭右开
-
- //输出
- for (int i = 1; i <= n; ++i)cout << a[i] << ' ';
- }

std::sort(begin, end);
begin和end是输入序列的起始迭代器和结束迭代器。需要注意的是,end迭代器指向的是序列尾部的"过去位置",即最后一个有效元素之后的位置。
- int main()
- {
- //初始化v
- vector<int>v = { 5,1,3,9,11 };
- // begin v[0] v[4] end()
-
- //对数组进行排序
- sort(v.begin(), v.end());
-
- //输出
- //for (int i = 0; i < v.size(); ++i)cout << v[i] << ' ';
- for (auto& i : v)cout << i << ' ';
-
- return 0;
- }
使用sort()我们不仅仅可以从大到小排或者从小到大排,还可以按照一定的准则进行排序。比如说我们按照每个数的个位进行从大到小排序,我们就可以根据自己的需求来写一个函数作为排序的准则传入到sort()中。
- //sort默认使用小于号进行排序,如果想要自定义比较规则,
- //可以传入第三个参数,可以是函数或lambda表达式(匿名函数)
- bool cmp(const int& u, const int& v)
- {
- return u > v;
- }
-
- int main()
- {
- ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
-
- //初始化
- vector<int> v = { 5,1,3,9,11 };
-
- //对数组进行排序,降序排序
- sort(v.begin(), v.end(),cmp);
-
- //输出
- /*for (int i = 0; i < v.size(); ++i)cout << v[i] << ' ';*/
- for (auto& i : v)
- //就是v中的数据
- {
- cout << i << ' ' ;
- }
- }

sort默认使用小于号进行排序,如果想要自定义比较规则
可以传入第三个参数,可以是函数或lambda表达式(匿名函数)。
- int main()
- {
- //初始化v
- vector<int>v = { 5,1,3,9,11 };
-
- //对数组进行排序,降序排序
- sort(v.begin(), v.end(), [](const int& u, const int& v)
- {
- return u > v;
- });
-
- //输出
- //for (int i = 0; i < v.size(); ++i)cout << v[i] << ' ';
- for (auto& i : v)
- //就是v中的数据
- {
- cout << i << ' ' ;
- }
-
-
- return 0;
- }

结构体可以将小于号重载后进行排序,当然,用前面的方法也是可行的
- struct Node
- {
- int u, v;
- bool operator<(const Node& m)const
- //重载的operator<是一个成员函数,
- //它接受一个const Node&类型的参数(即对另一个Node对象的常量引用),
- //并返回一个bool类型的结果。
- {
- //以u为第一关键字,v为第二关键字排序
- return u == m.u ? v < m.v : u < m.u;
- }
- };
-
- #include <iostream>
- using namespace std;
- int main()
- {
- int n; cin >> n;
- return 0;
- }

- #include<iostream>
- #include<string>
- #include<algorithm>
- using namespace std;
-
- struct Student{
- string name; // 学生姓名
- double score[4]; // 学生四门课的成绩
- };
-
- // 比较函数,用于sort排序,按照平均成绩从高到低排序
- bool cmp_score(const Student &x, const Student &y){
- double average_x = 0.0, average_y = 0.0;
- for(int i = 0; i < 4; i++){
- average_x += x.score[i];
- average_y += y.score[i];
- }
- average_x /= 4;
- average_y /= 4;
- return average_x > average_y;
- }
-
- int main(){
- Student stu[3]; // 存储三个学生的信息
-
- // 输入三个学生的姓名和四门课的成绩
- for(int i = 0; i < 3; i++){
- cin >> stu[i].name;
- for(int j = 0; j < 4; j++){
- cin >> stu[i].score[j];
- }
- }
-
- // 使用sort函数,按照平均成绩从高到低排序
- sort(stu, stu + 3, cmp_score);
-
- // 输出排序后的学生信息
- for(int i = 0; i < 3; i++){
- cout << stu[i].name << " ";
- for(int j = 0; j < 4; j++){
- cout << stu[i].score[j] << " ";
- }
- cout << endl; // 换行
- }
-
- return 0;
- }


- #include <bits/stdc++.h> // 包含了C++标准库中的大部分头文件
-
- using namespace std; // 使用标准命名空间std
-
- const int N = 5e5 + 3; // 定义一个常量N,其值为500003,作为数组a的最大可能大小
- int a[N]; // 定义一个全局数组a,大小为N
-
- int main()
- {
- int n; cin >> n; // 输入一个整数n,表示数组a中实际元素的数量
- for (int i = 1; i <= n; ++i) cin >> a[i];
- // 从a[1]开始(而不是通常的a[0]),输入n个整数到数组a中
-
- sort(a + 1, a + 1 + n); // 对数组a中从a[1]到a[n]的元素进行排序
-
- // 以升序打印数组a中的元素
- for (int i = 1; i <= n; ++i)
- cout << a[i] << " \n"[i == n];
- // 打印每个元素和一个空格,如果i等于n(即最后一个元素),则打印换行符
- // 这里使用了字符串字面量" \n"的数组索引技巧:
- // 当i==n时,[i==n]求值为[1],选择'\n';否则为[0],选择' '
-
- // 以降序打印数组a中的元素
- for (int i = n; i >= 1; --i)
- cout << a[i] << " \n"[i == 1];
- // 类似地,打印每个元素和一个空格,如果i等于1(即最后一个要打印的元素),则打印换行符
-
- return 0;
- }

min_element 和 max_element
头文件:#include<algorithm>
作用:返回容器中最小值和最大值的指针。max_element(first,end,cmp);其中cmp为可选择参数!
- int main()
- {
- //初始化
- vector<int>v = { 5,1,3,9,11 };
- // [ )
-
- //输出最大的元素,*表示解引用,即通过地址(迭代器)得到值
- cout << *max_element(v.begin(), v.end()) << '\n';
-
- }

- #include <bits/stdc++.h>
- using namespace std;
-
- const int N = 1e4 + 9;
- int a[N];
-
- int main() // 主函数
- {
- ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); // 加速输入输出流
- int n; cin >> n;
- for (int i = 1; i <= n; ++i) cin >> a[i];
-
- int mx = a[1], mi = a[1]; // 初始化最大值mx和最小值mi为数组的第一个元素a[1]
- for (int i = 1; i <= n; ++i) // 遍历数组a中的所有元素
- {
- mx = max(mx, a[i]); // 更新最大值mx
- mi = min(mi, a[i]); // 更新最小值mi
- }
-
- cout << mx << '\n' << mi << '\n'; // 输出最大值和最小值,每个值后面跟一个换行符
-
- long long sum = 0; // 定义一个长整型变量sum,用于存储数组a中所有元素的总和
- for (int i = 1; i <= n; ++i) sum += a[i]; // 遍历数组a,计算所有元素的总和
-
- cout << fixed << setprecision(2) << 1.0 * sum / n << '\n'; // 输出平均值,保留两位小数
- // 注意:这里使用1.0 * sum将sum转换为浮点数,以确保进行浮点数除法
-
- return 0; // 程序执行成功,返回0
- }

nth_element 会重新排列序列,使得第5小的元素位于正确的位置(索引为4的位置),且该元素之前的所有元素都不大于它,之后的元素都不小于它。- int main()
- {
- // 初始化一个包含7个整数的vector
- vector<int> v = { 5,1,7,3,10,18,9 };
-
- // 使用nth_element进行部分排序
- // 将v中的元素重新排列,使得v[3]位置上的元素位于排序后应在的位置
- // v[0]到v[2]的元素都不大于v[3],v[4]到v[6]的元素都不小于v[3]
- nth_element(v.begin(), v.begin() + 3, v.end());
-
- // 输出vector中的元素
- for (auto& i : v)
- cout << i << ' '; // 注意:这里应该使用' '空格而不是'\n'换行符
-
- return 0;
- }


今天就先到这了!!!

看到这里了还不给博主扣个:
⛳️ 点赞☀️收藏 ⭐️ 关注!
你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。