之前介紹的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; }