今天在写克鲁斯卡尔算法的时候碰到了一个问题,就是如何快速将边(Edge)这一结构体按权重(weight)排序,结构体如下:
struct Edge {
int vex1; //起点
int vex2; //终点
int weight; //权重
};
百度后发现头文件#include<algorithm>
中有一个sort
函数, 里面包含三个参数
- 第一个是要排序的数组的起始地址
- 第二个是结束的地址(最后一位要排序的地址的下一地址)
- 第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是从小到大排序。
在我这个问题中只要创建vector<Edge>
,然后自定义排序方法,就ok了。下面贴有关代码:
/*
自定义排序函数
*/
bool compare(const Edge &e1, const Edge &e2) {
return e1.weight < e2.weight; //权重从小到大排序
}
------------------------分割线
sort(e.begin(), e.end(), compare); //按边的权值从小到大排序
例子:按成绩均分排序
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
typedef long long LL ;
using namespace std;
int n;
struct stu
{
int num;
int x1;
int x2;
int x3;
double res; //均分
};
struct stu s[510];
bool compare(const stu &s1,const stu &s2) //按均分排序
{
return s1.res >s2.res;
}
int main()
{
while(cin>>n)
{
for(int i=0;i<n;i++)
cin>>s[i].num>>s[i].x1>>s[i].x2>>s[i].x3;
for(int i=0;i<n;i++) //计算均分
{
s[i].res=0.4*s[i].x1+0.35*s[i].x2+0.25*s[i].x3;
}
sort(s,s+n,compare);
for(int i=0;i<3;i++) //输出学号与均分
printf("%d %.1lf\n",s[i].num,s[i].res);
}
getchar();getchar();
return 0;
}
参考:https://blog.csdn.net/weixin_43189363/article/details/89893160