蓝桥杯算法练习笔记(2)__Sort排序

本文章基于《计蒜客2019年蓝桥杯算法训练营》整理记录,并由本人对部分内容进行补充,仅用于个人学习交流使用。

2.Sort排序

1.sort排序基础
#include<iostream>
#include<algorithm>
using namespace std;
bool cmp(int x,int y) {
	return x>y;//降序
}
bool cmp2(int x,int y) {
	int a1=x%2;
	int a2=y%2;
	return a1>a2;//对2求余后的降序
}
int main() {
	int a[10];
	for(int i=0; i<10; i++) {
		cin>>a[i];
	}

	sort(a,a+10);//默认升序
	for(int i=0; i<10; i++) {
		cout<<a[i]<<" ";
	}
	cout<<endl;

	sort(a,a+10,greater<int>());//降序greater<int>()
	for(int i=0; i<10; i++) {
		cout<<a[i]<<" ";
	}
	cout<<endl;

	sort(a,a+10,cmp);//自定义函数-降序
	for(int i=0; i<10; i++) {
		cout<<a[i]<<" ";
	}
	cout<<endl;

	sort(a,a+10,cmp2);//自定义函数-除余降序
	for(int i=0; i<10; i++) {
		cout<<a[i]<<" ";
	}
	return 0;
}
2.结构体排序
//结构体基础
struct Student {
	int score;
	string name;

	//结构体构造函数
	/*性质/特点
	1.函数名与结构体名相同
	2.没有返回值类型,没有return
	3.形参可有可无,可以有默认参数
	4.可以重载
	*/
	//默认构造函数 Student(){}
	Student(string name,int s) {
		name=n;
		score=s;
	}

}
#include<iostream>
#include<cstring>
using namespace std;
//结构体的构造函数--可以实现直接给构造体成员赋值
struct Student{
	int score;
	string name;
	
	//结构体初始化列表
	Student() {} //不可以省
	Student(string n,int s):name(n),score(s){} 
};

int main() {
	//结构体的初始化 
	Student stu[3];
	//结构体赋值 
	for(int i=0;i<3;i++){
		string n;
		int s;
		cin>>n>>s;
		stu[i]=Student(n,s);
	}
	//结构体遍历 
	for(int i=0;i<3;i++){
		cout<<stu[i].name<<" "<<stu[i].score<<endl;
	}
	
	return 0;
}
//案例:结构体按名字排序
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

struct Student{
	string name;
	int score[4];
};
//排序规则 
bool cmp(Student x,Student y){
	return x.name < y.name;
}

int main(){
	Student stu[3];
	for(int i=0;i<3;i++){
		cin>>stu[i].name;
		for(int j=0;j<4;j++){
			cin>>stu[i].score[j];
		}
	}
	
	sort(stu,stu+3,cmp);
	for(int i=0;i<3;i++){
		cout<<stu[i].name<<":";
		for(int j=0;j<4;j++){
			cout<<stu[i].score[j]<<" ";
		}
		cout<<endl;
	}
	
	return 0;
} 
/*案例:按成绩排序
输入:学生姓名 第1-4科成绩
输出:按成绩高低输出,如果第一门相同,则比较第二门成绩
案例:
	输入: 
	aaa 100 65 85 99
	bbb 100 65 89 52
	ccc 100 88 20 59
	输出: 
	ccc:100 88 20 59
	bbb:100 65 89 52
	aaa:100 65 85 99
*/

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

struct Student {
	string name;
	int score[4];
};
//排序规则
bool cmp(Student x,Student y) {
	if(x.score[0]!=y.score[0])
		return x.score[0]>y.score[0];

	if(x.score[1]!=y.score[1])
		return x.score[1]>y.score[1];

	if(x.score[2]!=y.score[2])
		return x.score[2]>y.score[2];

	return x.score[3]>y.score[3];

}

int main() {
	Student stu[3];
	for(int i=0; i<3; i++) {
		cin>>stu[i].name;
		for(int j=0; j<4; j++)
			cin>>stu[i].score[j];
	}
	sort(stu,stu+3,cmp);
	for(int i=0; i<3; i++) {
		cout<<stu[i].name<<":";
		for(int j=0; j<4; j++) {
			cout<<stu[i].score[j]<<" ";
		}
		cout<<endl;
	}

	return 0;
}
3.Sort排序练习
/*浮点数排序:
现在有N个正浮点数,现在需要将这些浮点数按照离他最近
的整数的差从小到大排序,浮点数与距离最近的整数的差
越小,这个浮点数的排位越靠前;如果差相等,按照浮点
数的值从小到大排序。 
*/
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const double ERSILON =1e-6;
//ERSILON用于修正浮点数误差,
//当两个浮点数相差1e-6时,我们认为他们相等
double num[105];
//浮点数按照离他最近的整数的差从小到大排序 
bool cmp(double a,double b) {
	//round()四舍五入函数 
	double da=fabs(a-round(a));
	double db=fabs(b-round(b));
	if(fabs(da-db)<ERSILON) {
		return a<b;
	}
	return da<db;
}
int main() {
	int N;
	cin>>N;

	for(int i=0; i<N; i++) {
		cin>>num[i];
	}

	sort(num,num+N,cmp);
	
	for(int i=0;i<N;i++){
		printf("%lf ",num[i]);
	}
	
	return 0;
}
//练习:交叉排序
//N个数中,第l1到r1升序,第l2到r2降序 

#include<iostream>
#include<algorithm>
using namespace std;

int main(){
	int N,l1,r1,l2,r2;
	cin>>N>>l1>>r1>>l2>>r2;
	int num[10005];
	for(int i=0;i<N;i++){
		cin>>num[i];
	} 
	sort(num+l1-1,num+r2);
	sort(num+l2-1,num+r2,greater<int>());
	for(int i=0;i<N;i++){
		cout<<num[i]<<" ";
	}
	return 0;
} 

/*样例输入: 
6 1 3 2 4
8 3 1 6 9 2
样例输出: 
1 8 6 3 9 2
*/
4.Vector()中的Sort()排序

重点: sort(ve.begin(),ve.end());

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int main() {

	vector<int> ve;
	for(int i=10; i>0; i--) {
		ve.push_back(i);
	}

	cout<<"排序前-----"<<endl;
	for(int i=0; i<10; i++) {
		cout<<ve[i]<<" ";
	}
	cout<<endl; 
	
	sort(ve.begin(),ve.end());// 用 (ve,ve+10) 是错的 
	//实际上end的前一个指针指向的元素才是插入时的最后一个值

	cout<<"排序后-----"<<endl;
	for(int i=0; i<10; i++) {
		cout<<ve[i]<<" ";
	}
	cout<<endl;

	//Vector()数组的另一种遍历
	for(vector<int>::iterator it=ve.begin();it!=ve.end();it++){
		cout<<*it<<" ";
	} 

	return 0;
}

/*
排序前-----
10 9 8 7 6 5 4 3 2 1
排序后-----
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
*/
数码管是一种常见的数字显示器件,可以用于显示各种数字、字母等字符。在单片机应用中,数码管通常用于显示计数器、计时器、温度、湿度等实时数据。 数码管的种类有很多,包括共阳数码管、共阴数码管、共阳共阴混合数码管等。其中,共阳数码管是最常见的一种,也是本文所涉及的数码管类型。 单片机控制数码管的原理是通过对数码管的各个管脚进行控制,使其显示相应的数字或字符。数码管的控制方式有两种,即静态显示和动态显示。 静态显示是指将要显示的数字或字符的每一位分别输出到数码管的每个管脚上,然后使其保持不变,从而实现显示效果。静态显示的缺点是需要使用大量的I/O口,且不能灵活地改变显示内容。 动态显示是指将要显示的数字或字符的每一位依次输出到数码管的每个管脚上,并在短时间内快速切换下一个数字或字符,从而形成连续的显示效果。动态显示的优点是可以使用较少的I/O口,且可以灵活地改变显示内容。 以下是一个简单的动态显示数码管的实现示例: 1. 定义数码管的引脚 ```c #define DIG_PORT P2 // 数码管位选端口 #define DIG_COM 0x00 // 数码管位选端口初始值 #define LED_PORT P0 // 数码管段选端口 ``` 2. 定义数码管显示的数字或字符 ```c unsigned char code ledChar[] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f }; ``` 3. 实现数码管动态显示函数 ```c void display(unsigned char i) { unsigned char j, k; for (j = 0; j < 8; j++) { DIG_PORT = DIG_COM | (1 << j); // 选择数码管位(从左到右) for (k = 0; k < 100; k++); // 延时,视情况可调整 LED_PORT = ledChar[i]; // 显示数码管上的数字或字符 } } ``` 4. 调用数码管动态显示函数 ```c int main() { unsigned char i = 0; while (1) { display(i % 10); // 显示数字 i 的个位数 i++; } return 0; } ``` 以上就是一个简单的数码管动态显示的实现示例。需要注意的是,数码管的控制方式和具体实现方法可能因不同的硬件平台和编程语言而有所不同。因此,在具体应用中需要根据实际情况进行适当的调整和修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值