【王道机试】第三章 排序与查找

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值