按结构体中的某一个元素进行排序()

今天在写克鲁斯卡尔算法的时候碰到了一个问题,就是如何快速将边(Edge)这一结构体按权重(weight)排序,结构体如下:

struct Edge {
 int vex1;   //起点
 int vex2;   //终点
 int weight; //权重
};

百度后发现头文件#include<algorithm>中有一个sort函数, 里面包含三个参数

  1. 第一个是要排序的数组的起始地址
  2. 第二个是结束的地址(最后一位要排序的地址的下一地址)
  3. 第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是从小到大排序。

在我这个问题中只要创建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

猜你喜欢

转载自blog.csdn.net/weixin_44026026/article/details/110305910