STL模板库之sort--算法--笔记

sort(用法一)

对基本类型的数组从小到大排序
sort(数组名+n1,数组名+n2);
n1和n2都是int类型的表达式,可以包含变量
如果n1=0,则+n1可以不写
将数组中下标范围为[n1,n2)的元素从小到大排序,下表为n2的元素不在排序区间内

int a[]={15,4,3,9,7,2,6};
sort(a,a+7);//对整个数组从小到大排序
int a[]={15,4,3,9,7,2,6};
sort(a,a+3);//结果:{3,4,15,9,7,2,6}
int a[]={15,4,3,9,7,2,6}
sort(a+2,a+5);//结果:{15,4,3,7,9,2,6}

sort(用法二)

对元素类型为T的基本类型数组从大到小排序:
方法:sort(数组名+n1,数组名+n2,greator<T>());

 int a[]={15,4,3,9,7,2,6};
 sort(a+1,a+4,greater<int>());//结果:{15,9,4,3,7,2,6}

sort(用法三)

用自定义的排序规则,对任何类型的T的数组排序
方法:sort(数组名+n1,数组名+n2,排序规则结构名());
排序规则结构的定义方式

struct 结构名
{
 bool operator()(const T&a1,const T&a2)const{
 //若a1应该在a2前面,则返回true
 //负责返回false
 }
};

从大到小:

struct Rule1//按从大到小排序
{
 bool operator()(const int &a1,const int &a2)const{
  return a1>a2; 
 }
};

按个位数从小到大排序

strcut Rule2//按个位数从小到大排序
{
 bool operator()(const int &a1,const int &a2)const
 {
  return a1%10<a2%10;
 }
}

用sort对结构数组进行排序


#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
struct Student{
 char name[20];
 int id;
 double gpa;
};
Student students []={
 {"Jack",112,3.4},{"Mary",102,3.8},{"Mary",117,3.9},
 {"Ala",333,3.5},{"Zero",101,4.0}
};
struct StudentRule1{//按姓名从小到大排序
bool operator()(const Student &s1,sonst Student &s2)const{
 if(stricmp(s1.name,s2.name)<0)
  return true;
 return false;
 }
};
struct StudentRule2{//按id从小到大排序
bool operator()(const Student &s1,sonst Student &s2)const{
  return s1.id<s2.id;
 }
};
struct StudengtRule3{//按gpa从高到低排序
 bool operator()(const Student &s1,const Student &s2)const{
  return s1.gpa>s2.gpa;
 }
}
int main(){
 int n=sizeof(students)/sizeof(Student);
 sort(students,students+n,StudentRule1());//按姓名从小到大排序
 PrintStudents(students,n);
 sort(students,students+n,StudentRule2());//按id从小到大排序
 PrintStudents(students,n);
 sort(students,students+n,StudentRule3());//按gpa从高到低排序
 PrintStudents(students,n);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Dijkstra算法是一种用于解决带权图的单源最短路径问题的贪心算法。它维护一个距离起点的最短路径已知的顶点集合,通过不断地扩展这个集合,最终得到从起点到所有顶点的最短路径。 Dijkstra算法的基本思想是,维护一个集合S,表示已经求出最短路径的顶点集合。一开始,S只包含起点。然后,每次从集合V-S中选取一个距离起点最近的顶点u,将其加入集合S中,并更新与u相邻的所有顶点的最短路径。 具体实现上,我们可以使用一个数组dis[]来存储每个顶点到起点的最短路径长度,数组vis[]表示该顶点是否已经被加入到集合S中。每次选取距离起点最近的顶点u后,我们遍历u的所有邻居v,并更新dis[v]的值,如果dis[v]发生了改变,我们就将v加入到一个优先队列中,等待下一次选择。 以下是Dijkstra算法的伪代码实现: ``` int n; // 顶点数 int dis[N]; // 存储起点到每个顶点的最短距离 bool vis[N]; // 标记每个顶点是否已经加入集合S中 vector<pair<int, int>> adj[N]; // 存储每个顶点的邻居 void dijkstra(int s) { // s为起点编号 memset(dis, 0x3f, sizeof dis); // 将dis数组初始化为无穷大 dis[s] = 0; // 起点到自身的距离为0 priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q; q.push({0, s}); // 将起点加入队列中 while (!q.empty()) { auto t = q.top(); q.pop(); int u = t.second; if (vis[u]) continue; // 如果该点已经在集合S中,直接跳过 vis[u] = true; // 将u加入集合S中 for (auto [v, w] : adj[u]) { // 遍历u的所有邻居 if (dis[v] > dis[u] + w) { // 如果从u到v的距离更短 dis[v] = dis[u] + w; // 更新dis数组 q.push({dis[v], v}); // 将v加入队列中 } } } } ``` 其中,priority_queue是一个优先队列,用于存储待选顶点。我们使用了STL中的pair来表示顶点与其到起点的距离。优先队列默认按照pair的第一个元素排序,因此我们需要自定义一个比较函数,将pair按照第二个元素(距离)排序。 Dijkstra算法的时间复杂度为O(ElogV),其中E为边数,V为顶点数。在实际应用中,Dijkstra算法的效率很高,能够处理大规模的图。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NoteLoopy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值