文章目录
3.1 排序
sort函数,algorithm头文件。编写compare函数,灵活应用sort函数解决排序问题。
sort(first, last, comp)
注意:原理是快排,不稳定。
C++ STL中sort()排序函数详解
例题3.1 排序
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
int n, tmp;
vector<int> arr;
scanf("%d", &n);
for(int i=0; i<n; i++){
scanf("%d", &tmp);
arr.push_back(tmp);
}
sort(arr.begin(), arr.end());
for(int i=0; i<n; i++){
printf("%d ", arr[i]);
}
return 0;
}
例题3.2 成绩排序
#include <iostream>
#include <algorithm>
#define MAXN 100
using namespace std;
typedef struct{
int sno;
int score;
}Student;
Student arr[MAXN];
bool Compare(Student x, Student y){
if(x.score == y.score){
return x.sno < y.sno;
}
else{
return x.score < y.score;
}
}
int main(){
int n;
scanf("%d", &n);
for(int i=0; i<n; i++){
scanf("%d %d", &arr[i].sno, &arr[i].score);
}
sort(arr, arr + n, Compare);
for(int i=0; i<n; i++){
printf("%d %d\n", arr[i].sno, arr[i].score);
}
return 0;
}
例题3.3 成绩排序
#include <iostream>
#include <algorithm>
using namespace std;
typedef struct{
string name;
int score;
int order;
}Student;
bool CompareDescending(Student x, Student y){
if(x.score == y.score){
return x.order < y.order;
}
return x.score > y.score;
}
bool CompareAscending(Student x, Student y){
if(x.score == y.score){
return x.order < y.order;
}
return x.score < y.score;
}
int main(){
int n, type;
while(scanf("%d %d", &n, &type) != EOF){
Student arr[n];
for(int i=0; i<n; i++){
cin >> arr[i].name >> arr[i].score;
arr[i].order = i;
}
if(type == 0){
sort(arr, arr + n, CompareDescending);
}else{
sort(arr, arr + n, CompareAscending);
}
for(int i=0; i<n; i++){
cout << arr[i].name << " " << arr[i].score << endl;
}
}
return 0;
}
习题3.1 特殊排序
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
int n;
int arr[1000];
while(scanf("%d", &n) != EOF){
for(int i=0; i<n; i++){
scanf("%d", &arr[i]);
}
if(n == 1){
printf("%d\n-1\n", arr[0]);
continue;
}
sort(arr, arr + n);
printf("%d\n", arr[n-1]);
for(int i=0; i<n-1; i++){
printf("%d ", arr[i]);
}
printf("\n");
}
return 0;
}
习题3.2 整数奇偶排序
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
int arr[10], a[10], b[10];
while(scanf("%d%d%d%d%d%d%d%d%d%d", &arr[0], &arr[1], &arr[2], &arr[3], &arr[4], &arr[5], &arr[6], &arr[7], &arr[8], &arr[9]) != EOF){
int na = 0, nb = 0;
for(int i=0; i<10; i++){
if(arr[i] % 2 == 0){
a[na++] = arr[i];
}
else{
b[nb++] = arr[i];
}
}
sort(a, a+na, less<int>{});
sort(b, b+nb, greater<int>{});
for(int i=0; i<nb; i++){
printf("%d ", b[i]);
}
for(int i=0; i<na; i++){
printf("%d ", a[i]);
}
printf("\n");
}
return 0;
}
习题3.3 小白鼠排队
#include <iostream>
#include <algorithm>
#define MAXN 100
using namespace std;
typedef struct{
int weight;
string hat;
}Mouse;
Mouse arr[MAXN];
bool Compare(Mouse x, Mouse y){
return x.weight > y.weight;
}
int main(){
int n;
while(scanf("%d", &n) != EOF){
for(int i=0; i<n; i++){
cin >> arr[i].weight >> arr[i].hat;
}
sort(arr, arr + n, Compare);
for(int i=0; i<n; i++){
cout << arr[i].hat << endl;
}
}
return 0;
}
习题3.4 奥运会排序问题
提交网址
用例有点离谱,人数可能会为0。所以当金牌或奖牌数为0时rate直接算0。
#include <iostream>
#include <algorithm>
using namespace std;
typedef struct{
int gold_medal;
int total_medal;
double num;
double gold_rate;
double total_rate;
}Country;
int main(){
int n, m;
while(scanf("%d%d", &n, &m) != EOF){
Country arr[n];
for(int i=0; i<n; i++){
scanf("%d%d%lf", &arr[i].gold_medal, &arr[i].total_medal, &arr[i].num);
arr[i].gold_rate = arr[i].gold_medal ? arr[i].gold_medal / arr[i].num : 0;
arr[i].total_rate = arr[i].total_medal ? arr[i].total_medal / arr[i].num : 0;
}
int tmp;
for(int i=0; i<m; i++){
scanf("%d", &tmp);
int rank[4] = {1, 1, 1, 1};
for(int j=0; j<n; j++){
if(j != tmp){
if(arr[j].gold_medal > arr[tmp].gold_medal) rank[0]++;
if(arr[j].total_medal > arr[tmp].total_medal) rank[1]++;
if(arr[j].gold_rate > arr[tmp].gold_rate) rank[2]++;
if(arr[j].total_rate > arr[tmp].total_rate) rank[3]++;
}
}
int last = min(rank[0], min(rank[1], min(rank[2], rank[3])));
for(int j=0; j<4; j++){
if(rank[j] == last){
printf("%d:%d\n", last, j+1);
break;
}
}
}
printf("\n");
}
return 0;
}
3.2 查找
c++库中的查找相关函数:binary_search, lower_bound, upper_bound等
C++ STL中的Binary search(二分查找)
例题3.4 找x
#include <iostream>
using namespace std;
int main(){
int n, arr[200], x;
while(scanf("%d", &n) != EOF){
for(int i=0; i<n; i++){
scanf("%d", &arr[i]);
}
scanf("%d", &x);
int i;
for(i=0; i<n; i++){
if(arr[i] == x){
printf("%d\n", i);
break;
}
}
if(i == n){
printf("-1\n");
}
}
return 0;
}
例题3.5 查找
可以直接用set来做。
#include <iostream>
#include <set>
using namespace std;
int main(){
int n;
set<int> st;
while(scanf("%d", &n) != EOF){
int tmp;
while(n--){
scanf("%d", &tmp);
st.insert(tmp);
}
int m;
scanf("%d", &m);
while(m--){
scanf("%d", &tmp);
if(st.count(tmp)){
printf("YES\n");
}else{
printf("NO\n");
}
}
}
return 0;
}
习题3.5 找最小数
#include <iostream>
#include <algorithm>
using namespace std;
typedef struct{
int x;
int y;
}Pair;
bool Compare(Pair p1, Pair p2){
if(p1.x < p2.x) return true;
else if(p1.x == p2.x) return p1.y < p2.y;
else return false;
}
int main(){
int n;
while(scanf("%d", &n) != EOF){
Pair p[n];
for(int i=0; i<n; i++){
scanf("%d%d", &p[i].x, &p[i].y);
}
sort(p, p + n, Compare);
printf("%d %d\n", p[0].x, p[0].y);
}
return 0;
}
习题3.6 打印极值点下标
#include <iostream>
using namespace std;
int main(){
int n;
while(scanf("%d", &n) != EOF){
int a[n];
for(int i=0; i<n; i++){
scanf("%d", &a[i]);
}
for(int i=0; i<n; i++){
if(i == 0 && a[0] != a[1]) printf("0 ");
else if(i == n-1 && a[n-1] != a[n-2]) printf("%d ", n-1);
else if((a[i] < a[i-1] && a[i] < a[i+1]) || (a[i] > a[i-1] && a[i] > a[i+1])){
printf("%d ", i);
}
}
printf("\n");
}
return 0;
}
习题3.7 找位置
提交网址
将map和vector综合起来使用。
#include <iostream>
#include <map>
#include <vector>
#include <string>
using namespace std;
int main(){
string str;
while(cin >> str){
int len = str.length();
map<char, vector<int>> mp;
vector<char> v;
for(int i=0; i<len; i++){
if(mp.count(str[i]) == 0){
v.push_back(str[i]);
mp[str[i]] = {};
}
mp[str[i]].push_back(i);
}
for(int i=0; i<v.size(); i++){
if(mp[v[i]].size() > 1){
for(int j=0; j<mp[v[i]].size()-1; j++){
printf("%c:%d,", v[i], mp[v[i]][j]);
}
printf("%c:%d\n", v[i], mp[v[i]][mp[v[i]].size()-1]);
}
}
}
return 0;
}