#include<bits/stdc++.h>usingnamespace std;boolcmpUp(double a,double b)//升序 {return a < b;}boolcmpDown(double a,double b)//降序 {return a > b;}intmain(){char s[10];//保存性別字符串 double a, male[45], female[45];int n, mi =0, fi =0;//mi:male中元素個數 fi:female中元素個數 cin >> n;for(int i =1; i <= n;++i){cin >> s >> a;if(s[0]=='m')male[++mi]= a;elsefemale[++fi]= a;}sort(male+1, male+1+mi, cmpUp);//男生升序排序 sort(female+1, female+1+fi, cmpDown);//女生降序排序for(int i =1; i <= mi;++i)cout << fixed <<setprecision(2)<< male[i]<<' ';for(int i =1; i <= fi;++i)cout << fixed <<setprecision(2)<< female[i]<<' ';return0;}
插入排序+scanf、printf
#include<bits/stdc++.h>usingnamespace std;intmain(){char s[10];//保存性別字符串 double a, male[45], female[45];int n, mi =0, fi =0;//mi:male中元素個數 fi:female中元素個數 scanf("%d",&n);for(int i =1; i <= n;++i){scanf("%s %lf", s,&a);if(s[0]=='m'){male[++mi]= a;for(int j = mi; j >1;--j){if(male[j]< male[j-1])//男生升序排序 swap(male[j], male[j-1]);elsebreak;}}else{female[++fi]= a;for(int j = fi; j >1;--j){if(female[j]> female[j-1])//女生降序排序swap(female[j], female[j-1]);elsebreak;}}}for(int i =1; i <= mi;++i)printf("%.2f ", male[i]);for(int i =1; i <= fi;++i)printf("%.2f ", female[i]);return0;}
解法2:整合為一個比較條件
使用STL sort函數 + 重載<運算符
#include<bits/stdc++.h>usingnamespace std;structStu{char s[15];//性別 double h;//身高booloperator<(const Stu &b)const//返回自身是否應該排在b的前面 {if(s[0]=='m'&& b.s[0]=='m')//都是男生,更矮的在前面 return h < b.h;elseif(s[0]=='f'&& b.s[0]=='f')//都是女生,更高的排在前面return h > b.h;else//一男一女 return s[0]=='m';//如果本身是男生,自己應該排在前面,返回真。如果本身不是男生,自己不該排在前面,返回假。 }};intmain(){Stu a[45];int n;cin >> n;for(int i =1; i <= n;++i)cin >> a[i].s >> a[i].h;sort(a+1, a+1+n);for(int i =1; i <= n;++i)cout << fixed <<setprecision(2)<< a[i].h <<' ';return0;}
使用冒泡排序 判斷條件寫成表達式
#include<bits/stdc++.h>usingnamespace std;structStu{char s[15];//性別 double h;//身高};intmain(){Stu a[45];int n;cin >> n;for(int i =1; i <= n;++i)cin >> a[i].s >> a[i].h;for(int i =1; i <= n-1;++i)//冒泡排序 for(int j =1; j <= n-i;++j)if(a[j].s[0]=='m'&& a[j+1].s[0]=='m'&& a[j].h > a[j+1].h ||//都是男生,更矮的在前面 a[j].s[0]=='f'&& a[j+1].s[0]=='f'&& a[j].h < a[j+1].h ||//都是女生,更高的排在前面a[j].s[0]=='f'&& a[j+1].s[0]=='m')//性別不同,男在前女在后swap(a[j], a[j+1]);for(int i =1; i <= n;++i)cout << fixed <<setprecision(2)<< a[i].h <<' ';return0;}