问题标题: 酷町堂:怎样用sort函数实现结构体快排???

1
0

0
已采纳
赵逸凡
赵逸凡
初级启示者
初级启示者

sort就是结构体排序

赵逸凡在2018-08-25 17:08:10追加了内容

const int tree_old=10000;

struct a_family

{

    int son_dot,daughter_dot,father_tree,brother_line
}family[tree_old];

main函数里输入n

bool cmp(a_family a,a_family b)

{

    if(a.son_dot!=b.son_dot)return a.son_dot>b.son_dot;

    将son_dot元素从大到小排列,排整个结构体
}

for(int i=0;i<n;i++)cin>>family[i]. son_dot,daughter_dot,father_tree,brother_line

sort(family,family+n,cmp)//不要cmp默认是升序排列,从小到大,但要保证结构体的元素每次只有一个

赵逸凡在2018-08-25 17:10:29追加了内容

#include <algorithm>这个头文件不能忘
typedef struct example
{
    int elem1;
    int elem2;
}example;

/*这个comparison函数很重要.如果希望升序排序,就是"<",降序排列就是">"号,这样便于直观记忆.如果希望用elem2作为比较标准
就把elem1改为elem2,这样结构体就以elem2为比较标准排序了.*/ 
bool comparison(example a,example b){
    return a.elem1<b.elem1;
}
    int N;
    fin>>N;
   vector<example> array(N);
   for(int i=0;i<N;i++)
    {
        fin>>array[i].elem1>>array[i].elem2;
    }

   sort(array.begin(),array.end(),comparison);

   for(int i=0;i<N;i++)
    {
        cout<<array[i].elem1<<" "<<array[i].elem2<<endl;
    }

 

赵逸凡在2018-08-25 17:11:30追加了内容

刚才的代码是noi赛的部分代码

0
朱智霖
朱智霖
新手守护
新手守护

好好看着我装逼装出来的程序🆒

#include<iostream>
#include<iomanip>
#include<cstdio>  
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{
    int n,a[110],i;
    cin>>n;
    for(i=1;i<=n;i++)
    cin>>a[i];
    sort(a+1,a+n+1);
    for(i=1;i<=n;i++) cout<<a[i]<<' ';
    return 0;
}

别举报,由于这个问题特殊,我才大大方方的给了你们源代码(好像并不是某一题的吧?)

0
0
赵天乐
赵天乐
高级守护
高级守护

## 结构体与sort排序的完美结合 ## 
在实际问题中,一组数据往往具有不同的数据类型。例如, 在学生登记表中,姓名应为字符型;学号可为整型或字符型; 年龄应为整型;性别应为字符型;成绩可为整型或实型。 显然不能用一个数组来存放这一组数据。 因为数组中各元素的类型和长度都必须一致,以便于编译系统处理。为了解决这个问题,C++语言中给出了另一种构造数据类型——“结构”。 它相当于其它高级语言中的记录。 
C++中定义了一组表示整数、浮点数、单个字符和布尔值的算术类型(arithmetic type)。还有空类型:关键字void,不能用于普通变量的声明和普通的操作,只能用于指针型变量,函数返回值和函数参数。这些统称为预定义类型。 
另一类为自定义类型:数组、结构体(struct)、联合体(union)、枚举(enum)。

一、结构类型: 
“结构”是一种构造类型,它是由若干“成员”组成的。 每一个成员可以是一个基本数据类型或者又是一个构造类型。 结构即是一种“构造”而成的数据类型, 那么在说明和使用之前必须先定义它,也就是构造它。如同在说明和调用函数之前要先定义一样。

二、结构的定义: 
struct 名称{ 
数据类型 变量名1; 
数据类型 变量名2; 
。。。。 
数据类型 变量名n; //成员表 
成员函数; //可以没有 
}结构体变量名;

成员表由若干个成员组成, 每个成员都是该结构的一个组成部分。对每个成员也必须作类型说明,其形式为: 
类型说明符 成员名; 
成员名的命名应符合标识符的书写规定。 
例如: 






7 struct stu 

int num; 
char name[20]; 
char sex; 
float score; 
}; 
在这个结构定义中,结构名为stu,该结构由4个成员组成。 第一个成员为num,整型变量;第二个成员为name,字符型数组;第三个成员为sex,字符型变量;第四个成员为score,浮点型变量。 应注意在括号后的分号是必不可少的。 
值得一提的是,在C++中,struct的功能得到了强化,struct不仅可以添加成员变量,还可以添加成员函数,和class类似。

三、struct结构体的使用: 
在定义了一个结构类型后,可以定义该类型的变量。 
例如: 






7 struct stu 

int num; 
char name[20]; 
char sex; 
float score; 
}a[100]; 
这样就定义了stu型的有100个存储空间的a数组 
还可以: 









10 
11

struct stu
{
    int num;
    char name[20];
    char sex;
    float score;
};   //注意这里不能省略;
int main()
{
    stu a[100];
}//效果如上
见下例:
struct DATA{
    int a[2];                      //成员为一个数组
    int c;                      
    }data_a,data_b;   
或者:
struct DATA{
    int a[2];                      
    int c;                  
    };
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

DATA data_a,data_b;//这种定义方式与上一种方式的效果是相同的,可放在主函数内或外;

四、结构体成员的调用: 
结构体变量与各个成员之间引用的一般形式为: 
结构体变量名. 成员名 
对于上面定义的结构体变量,我们可以这样操作: 
cin>>data_a.a[0]>>data_a.a[1]; //一般情况下不能写 cin>>data_a; 
int a=data_a.a[0]+data_a.a[1]; //就像用整形变量一样用a[0]、a[1] 
data_b=data_a; //结构体之间的相互赋值是合法的 
data_a.c=0; //就如同给整形变量赋值 
实际上结构体成员的操作与该成员类型所具有的操作是一致的。 
关于结构体里的成员函数我们先忽略掉。

成员运算符“.”在存取成员数值时使用,其优先级最高,并具有左结合性。在处理包含结构体的结构体时,可记作: 
strua. strub. membb 
这说名结构体变量 strua 有结构体成员 strub;结构体变量 strub 有成员 membb。

课堂练习:请同学们定义一个包含:姓名,身高(厘米),体重(公斤),性别,工资(元),家庭住址的个人信息结构体,并完成输入和输出。(单人)

五、结构体操作实例: 
阅读理解下例:

#include<iostream>
using namespace std;
struct DATA{
    int a[2];                       //成员为一个数组
    int c;               //用来计算总和
    int max()                     //定义成员函数
    {
       return a[0]>a[1]?a[0]:a[1];  
                                               //默认该结构体变量的成员作为引用参数
    }
   }data_a[5];         //我们可以定义结构体数组        
         /*结构体的初始化,按成员定义的顺序赋值,每个成员用“,”隔开*/
   DATA  data_b={{15,20},35};        /*每个成员初始化和同类型变量初始化方式相同*/
int main() {
    cout<<data_b.max()<<endl;     
    for (int i=0;i<5;++i) {
        cin>>data_a[i].a[0]>>data_a[i].a[1];
        data_a[i].c=data_a[i].a[0]+data_a[i].a[1];
    }
    for (int i=0;i<5;++i)
        cout<<data_a[i].max()<<' '<<data_a[i].c<<endl;
    return 0;   
   }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

   程序会先输出: 
   20 
   输入样例: 
   19 63 25 36 10 12 25 96 36 12 
   输出: 
   63 82 //最大值,和; 
   36 61 
   12 22 
   96 121 
   36 48

例1、我们来观察下怎么对结构体里的某些成员来排序: 
单一成员排序: 
见书194页第一题:

#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;
struct student
{
    float score;
    int id;
}a[101];
int comp(const student &a,const student &b)
{
    return a.score>b.score;
}
int main()
{
    int n,k;
    cin>>n>>k;
    for (int i=1;i<=n;++i)      
        cin>>a[i].id>>a[i].score;
    sort(a+1,a+n+1,comp);
    cout<<a[k].id<<' '<<a[k].score<<endl;
    return 0;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

例2、每当考试结束,老师总要对学生的成绩进行排序,以便研究学生学习情况。老师发现学生数目庞大,所以找来了会编程的你,并且它给你了全部同学的分数,希望你能按如下规则排序:1.分数高的排在前面;2.如果分数相同,就把名字字典序低的放在前面。 
【输入格式】 
第一行一个整数n 
接下来n行每行一个学生名字、性别、分数。 
【输出格式】 
每行一个名字和一个分数 
【输入样例】 

Xiaoxiao female 396 
Yingmo male 405 
Diyucailang male 399 
【输出样例】 
Yingmo 405 
Diyucailang 399 
Xiaoxiao 396 
分析:在更多情况下,我们不仅对一个特征进行排序,而是多个特征。例如将学生的成绩进行排序,这时,我们就想到了结构体这种数据类型。当我们采用sort()函数的默认规则排序结构体时,sort()默认结构体中的第一个成员为第一关键字,第二个成员为第二关键字,……,第N个元素为第N关键字,然后从小到大排序;但自定义的数据类型一定要重载大于号,小于号等比较运算符。 
例如我们要将学生的成绩从大到小排序,当成绩相同时,根据姓名字典序小的优先的规则排进行序。显然我们无法采用默认规则进行排序。 
这时我们可以定义这样的comp: 
   int score_comp(const student & a,const student & b) 
   { 
    if (a.score>b.score) return 1; 
    if (a.score

我要回答