zoukankan      html  css  js  c++  java
  • 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;
    }

     

  • 相关阅读:
    linux 监控(未完...)
    linux命令快速入门
    [转]开源语音数据集
    websocket-client 试用简记
    gevent BrokenPipeError[未解决]
    locust 试用简记
    pydub 把音频按时间段切成小段(结合ffmpeg)
    ffmpeg & ffmpeg-python 试用(音频)
    Vue父组件向子组件传递数据
    uni-app 中 使用 scroll-view 想要手指触摸滑动,竟然不生效
  • 原文地址:https://www.cnblogs.com/bewolf/p/4442441.html
Copyright © 2011-2022 走看看