sort+结构体实现二级排序

之前介绍的sort函数由于其效率较高,使用较为简单让我用起来那叫一个爽,今天再写一篇使用sort+结构体实现二级排序的方法。

还是先想个问题吧,比如我想输入5个同学的名字和身高,然后得到他们身高的降序,但是如果出现相同身高的情况,名字的拼音靠前的排在前面。

好,现在这个问题已经涉及到了二级排序,要按照身高的降序和姓名的升序排列,那么就要先定义一个结构体,将姓名和身高都包含进去,然后用sort对结构体排序,而实现二级排序,关键在于自己写的cmp函数(sort的比较方法)

 1 #include<iostream>
 2 #include<string>
 3 #include<algorithm>
 4 using namespace std;
 5 struct Person
 6 {
 7     string name;
 8     int hegh;
 9 };
10 bool cmp(Person p1,Person p2)
11 {
12     if(p1.hegh>p2.hegh)//一级排序
13     {
14         return true;
15     }
16     else
17     {
18         if(p1.hegh==p2.hegh)
19         {
20             if(p1.name<p2.name)//二级排序
21             {
22                 return true;
23             }
24             else
25             {
26                 return false;
27             }
28         }
29         else
30         {
31             return false;
32         }
33     }
34 }
35 int main()
36 {
37     Person p[5];
38     for(int i=0;i<5;i++)
39     {
40         cin>>p[i].name>>p[i].hegh;
41     }
42     cout<<"排序前:"<<endl;
43     for(int i=0;i<5;i++)
44     {
45         cout<<p[i].name<<" "<<p[i].hegh<<endl;
46     }
47     sort(p,p+5,cmp);
48     cout<<"排序后:"<<endl;
49     for(int i=0;i<5;i++)
50     {
51         cout<<p[i].name<<" "<<p[i].hegh<<endl;
52     }
53     return 0;
54 }

下面来个稍微复杂一点的应用

如果统计的个数相同,则按照ASII码由小到大排序输出 。如果有其他字符,则对这些字符不用进行统计。

实现以下接口: 输入一个字符串,对字符中的各个英文字符,数字,空格进行统计(可反复调用) 按照统计个数由多到少输出统计结果,如果统计的个数相同,则按照ASII码由小到大排序输出 清空目前的统计结果,重新统计

思路:先构造hash表统计字符出现的次数,然后对hash表进行二级排序

#include<iostream>
#include<string>
using namespace std;
int main()
{
    int num;
    string str;
    string s;
    cin>>num;
    while(num-->0)
    {
        cin>>s;
        if(!str.empty())
        {
            str=str+s;
        }
        else
        {
            str=s;
        }
        if(str.length()==8)
        {
            cout<<str<<endl;
            str.clear();
        }
        else if(str.length()<8)
        {
            str.insert(str.length(),8-str.length(),'0');
            cout<<str<<endl;
            str.clear();
        }
        else if(str.length()>8)
        {
            cout<<str.substr(0,8)<<endl;
            str=str.substr(8,str.length()-8);
            break;
        }
    }
    if(!str.empty())
    {
        str.insert(str.length(),8-str.length(),'0');
        cout<<str<<endl;
    }
    return 0;
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大闲人柴毛毛

三分钟理解“桥接模式”——设计模式轻松掌握

什么是桥接模式? 将两个继承体系使用聚合/组合连接在一起,这就是桥接模式。 桥接模式的类图 ? 桥接模式中,最大的特色就中两个继承体系中间的那座桥(聚合/组合)...

31080
来自专栏nummy

简单工厂模式

简单工厂模式又叫静态工厂方法模式,工厂模式家族中最简单的一种模式。这个模式的基本工作方式: 通过一个工厂来决定创建哪种具体的产品实例。

6810
来自专栏Crossin的编程教室

全菊变量和菊部变量

前阵子还自我吐槽了下文章的选题,热点没营养,干货没人看。这下好了,找到了热点与干货的完美结合

12520
来自专栏java一日一条

提高代码质量:如何编写函数

函数是实现程序功能的最基本单位,每一个程序都是由一个个最基本的函数构成的。写好一个函数是提高程序代码质量最关键的一步。本文就函数的编写,从函数命名,代码分布,技...

11620
来自专栏程序员互动联盟

【编程基础】C++ Primer快速入门之八:语句

1 定义: 语句就是我们说话,当然这里是指我们用计算机来说话--说人话。类似于自然语言中的句子。C++设计了简单的一句话语句,也设计了由一组语句组成的复杂语句-...

364110
来自专栏北京马哥教育

Python 工匠:善用变量来改善代码质量

16680
来自专栏程序人生

谈谈面向对象编程

最近写了些和函数式编程的文章,有读者和我讨论函数式编程和面向对象编程的优劣。二者都是很好的编程思想,都在着力解决代码重用的问题,也彼此吸收对方的优点,所以大可不...

434110
来自专栏阿杜的世界

《Java 8实战》阅读笔记(1)

给方法listFiles传递方法引用**File::isHidden**

12540
来自专栏程序人生

来来来,咱们元编程入个门

前一篇文章竟然被很多人批「干货太少」 —— 一看你们就没有看过 Rich 他老人家的 Hammock Driven Development(我很久前推荐过滴),...

349100
来自专栏阿杜的世界

《Scala程序设计》阅读书摘

JVM上的语言越来越多了,从前几年的groovy、Scala和Clojure,现在又听说一门Kotlin。对于前三种语言,groovy算是JVM平台上的动态脚本...

9520

扫码关注云+社区

领取腾讯云代金券