之前介绍的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;
}
原文:http://www.cnblogs.com/bewolf/p/4442441.html