xcx:排序方法那么多,为什么推荐使用sort()排序呢?
shy:快速排序时间复杂度O(nlogn),在排序算法中还是比较快的一种。在算法竞赛中用的排序直接使用STL大法,省时又省力,何乐而不为?
shy:下面我们就来好好介绍一下sort()排序ヾ(≧▽≦*)o
文章目录
在C++中,
sort
函数是标准库
<algorithm>
中的一个非常有用的工具,用于对数组或容器中的元素进行排序。下面是
sort
函数的基本使用方法和几个示例:
基本使用方法
sort
函数的基本语法如下:
#include <algorithm>
void sort(Iterator first, Iterator last);
first
和last
是迭代器,表示要排序的范围。对于数组,可以使用指针作为迭代器;对于STL容器(如vector
、list
等),可以直接使用容器提供的迭代器。
sort(a,a+n); //从a[0]到a[n-1],升序
sort(a,a+n,cmp); //从a[0]到a[n-1],自定义排序
sort(a+1,a+1+n); //从a[1]到a[n],升序
sort(a+1,a+1+n,cmp); //从a[1]到a[n],自定义排序
示例1:对数组进行升序排序
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int numbers[] = {5, 2, 8, 1, 3};
int size = sizeof(numbers) / sizeof(numbers[0]);
// 使用 sort 对数组进行升序排序
sort(numbers, numbers + size);
// 打印排序后的数组
cout << "升序排序: ";
for (int i = 0; i < size; ++i) {
cout << numbers[i] << " ";
}
return 0;
}
示例2:对容器(如vector)进行升序排序
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> numbers = {5, 2, 8, 1, 3};
// 使用 sort 对容器进行升序排序
sort(numbers.begin(), numbers.end());
// 打印排序后的容器
cout << "升序排序: ";
for (int num : numbers) {
cout << num << " ";
}
return 0;
}
示例3:对自定义结构体进行排序
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 定义一个包含两个整数的结构体
struct Point {
int x, y;
};
// 定义比较函数,用于告诉 sort 如何比较 Point 对象
bool comparePoints(const Point& a, const Point& b) {
// 先按 x 升序排序,若 x 相同则按 y 升序排序
if (a.x == b.x) {
return a.y < b.y;
}
return a.x < b.x;
}
int main() {
vector<Point> points = {{5, 2}, {8, 1}, {3, 4}};
// 使用自定义比较函数对结构体进行排序
sort(points.begin(), points.end(), comparePoints);
// 打印排序后的结构体数组
cout << "结构体排序: ";
for (const Point& p : points) {
cout << "(" << p.x << ", " << p.y << ") ";
}
return 0;
}
注意事项
sort
函数默认进行升序排序。如果你想要进行降序排序,可以提供一个自定义的比较函数,如示例三。sort
函数是稳定的,即相等元素的相对顺序在排序后保持不变。- 对于大型数据集,
sort
函数可能不是最高效的选择。在这种情况下,你可能需要考虑使用更高效的排序算法或数据结构。
实战
题目:305公司选拔招新
题目描述
305集团今年预计招入一批人员,现在有n个人向公司投来了简历,先后经过了笔试和面试两次考核。
每个人的笔试成绩x与面试成绩y都已经记录了下来。
经过商量讨论,本着择优录取的原则,305集团决定招募m个人加入公司。
以总成绩作为参考标准,其中笔试成绩(满分100分)占总成绩的60%,面试成绩(满分100分)占总成绩的40%。
请你按成绩从高到低的顺序输出每个录取人员的姓名。
输入描述
第1行输入两个整数n和m(1≤m≤n≤100),分别表示参与考核的总人数和公司决定录用的人数。
第2到n+1行,依次输入一个字符串s表示每个人的姓名,整数x表示每个人的笔试成绩,整数y表示每个人的面试成绩(1≤s≤20,1≤x,y≤100)。
输出描述
输出m行,按成绩从高到低的顺序输出m个录取人员的姓名。
如果两个人总成绩相等,则取面试成绩高的人录取,将成绩排序后,如果第m名后有与第m名同分的人,则一并录取,同分的人输出时按照输入时的顺序输出。
总成绩可为小数。
示例1
输入
8 6 zhaji_Z 86 92 xiaoyu_Q 94 90 doggy 66 82 congcong_Z 89 94 hanfeng 80 88 bear 77 81 KillerWhale 87 71 cat 72 69
输出
xiaoyu_Q congcong_Z zhaji_Z hanfeng KillerWhale bear
示例2
输入
4 2 huize_L 89 92 xinyu_L 89 92 jiarui_Z 95 93 Cat 85 84
输出
jiarui_Z huize_L xinyu_L
Code:
#include<iostream>
#include<algorithm>
using namespace std;
struct student
{
string name;
int s1; //笔试成绩
int s2; //面试成绩
double c; //总成绩
};
bool cmp(student a,student b)
{
if(a.c==b.c) return a.s2>b.s2; //如果总成绩相同,则取面试成绩高的人录取
else if (a.s1==b.s1 && a.s2==b.s2) return 1; //同分一并录取,同分的人输出时按照输入时的顺序输出,顺序不变
return a.c>b.c; //按总成绩降序排序
}
int main()
{
student s[110];
int a,b;
cin>>a>>b;
for(int i=0;i<a;i++)
{
cin>>s[i].name>>s[i].s1>>s[i].s2; //输入姓名,笔试成绩,面试成绩
s[i].c=s[i].s1*0.6+s[i].s2*0.4; //计算总成绩=笔试成绩*60%+面试成绩*40%
}
sort(s,s+a,cmp); //按照自定义比较的函数进行排序
for(int k=0;k<b;k++)
{
cout<<s[k].name<<endl;
}
for(int i=b;i<a;i++)
{
if((s[i].s1==s[i-1].s1)&&(s[i].s2==s[i-1].s2))cout<<s[i].name<<endl; //同分一并录取
}
return 0;
}